Nie musisz wywoływać Rollback
ręcznie, ponieważ używasz using
oświadczenie.
DbContextTransaction.Dispose
metoda zostanie wywołana na końcu using
blok. I automatycznie wycofa transakcję, jeśli transakcja nie zostanie pomyślnie zatwierdzona (nie wywołane lub napotkane wyjątki). Poniżej znajduje się kod źródłowy SqlInternalTransaction.Dispose
metoda (DbContextTransaction.Dispose
w końcu przekaże to podczas korzystania z dostawcy SqlServer):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Widzisz, sprawdza, czy _innerConnection
nie jest null, jeśli nie, wycofaj transakcję (jeśli zatwierdzona, _innerConnection
będzie zerowa). Zobaczmy, co Commit
robi:
internal void Commit()
{
// Ignore many details here...
this._innerConnection.ExecuteTransaction(...);
if (!this.IsZombied && !this._innerConnection.IsYukonOrNewer)
{
// Zombie() method will set _innerConnection to null
this.Zombie();
}
else
{
this.ZombieParent();
}
// Ignore many details here...
}
internal void Zombie()
{
this.ZombieParent();
SqlInternalConnection innerConnection = this._innerConnection;
// Set the _innerConnection to null
this._innerConnection = null;
if (innerConnection != null)
{
innerConnection.DisconnectTransaction(this);
}
}