U hoeft Rollback
niet te bellen handmatig omdat u de using
. gebruikt uitspraak.
DbContextTransaction.Dispose
methode wordt aan het einde van de using
. aangeroepen blok. En het zal de transactie automatisch terugdraaien als de transactie niet succesvol is doorgevoerd (niet aangeroepen of uitzonderingen aangetroffen). Hieronder volgt de broncode van SqlInternalTransaction.Dispose
methode (DbContextTransaction.Dispose
zal er uiteindelijk aan delegeren bij gebruik van SqlServer-provider):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Zie je, het controleert of _innerConnection
is niet null, zo niet, de transactie terugdraaien (indien vastgelegd, _innerConnection
zal nul zijn). Laten we eens kijken wat Commit
doet:
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);
}
}