Du behøver ikke at ringe til Rollback
manuelt, fordi du bruger using
udmelding.
DbContextTransaction.Dispose
metode vil blive kaldt i slutningen af using
blok. Og det vil automatisk rulle transaktionen tilbage, hvis transaktionen ikke er gennemført (ikke kaldet eller stødt på undtagelser). Følgende er kildekoden til SqlInternalTransaction.Dispose
metode (DbContextTransaction.Dispose
vil endelig uddelegere til det, når du bruger SqlServer-udbyderen):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Ser du, den tjekker om _innerConnection
er ikke null, hvis ikke, tilbagefør transaktionen (hvis den er forpligtet, _innerConnection
vil være nul). Lad os se, hvad Commit
gør:
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);
}
}