No necesita llamar a Rollback
manualmente porque está utilizando using
declaración.
DbContextTransaction.Dispose
se llamará al método al final de using
cuadra. Y revertirá automáticamente la transacción si la transacción no se confirma con éxito (no se llama ni se encuentran excepciones). El siguiente es el código fuente de SqlInternalTransaction.Dispose
método (DbContextTransaction.Dispose
finalmente lo delegará cuando use el proveedor SqlServer):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Verá, comprueba si _innerConnection
no es nulo, si no, revierte la transacción (si se confirma, _innerConnection
será nulo). Veamos qué Commit
hace:
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);
}
}