Nemusíte volat Rollback
ručně, protože používáte using
prohlášení.
DbContextTransaction.Dispose
metoda bude volána na konci using
blok. A automaticky vrátí transakci zpět, pokud transakce není úspěšně potvrzena (není volána nebo nenarazí na výjimky). Následuje zdrojový kód SqlInternalTransaction.Dispose
metoda (DbContextTransaction.Dispose
nakonec na něj deleguje při použití poskytovatele SqlServer):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Vidíte, kontroluje, zda _innerConnection
není null, pokud ne, vrátí transakci zpět (pokud je potvrzena, _innerConnection
bude nulový). Podívejme se, co se Commit
dělá:
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);
}
}