Sie müssen Rollback
nicht aufrufen manuell, da Sie den using
verwenden Erklärung.
DbContextTransaction.Dispose
Methode wird am Ende des using
aufgerufen Block. Und es wird die Transaktion automatisch zurücksetzen, wenn die Transaktion nicht erfolgreich festgeschrieben wurde (nicht aufgerufen oder aufgetretene Ausnahmen). Es folgt der Quellcode von SqlInternalTransaction.Dispose
Methode (DbContextTransaction.Dispose
wird bei Verwendung des SqlServer-Anbieters schließlich daran delegiert):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Sie sehen, es prüft, ob _innerConnection
nicht null ist, falls nicht, setzen Sie die Transaktion zurück (falls festgeschrieben, _innerConnection
wird null sein). Mal sehen, was Commit
ist tut:
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);
}
}