Você não precisa chamar
Rollback
manualmente porque você está usando o using
demonstração. DbContextTransaction.Dispose
será chamado no final do using
quadra. E ele reverterá automaticamente a transação se a transação não for confirmada com sucesso (não chamada ou encontrada exceções). A seguir está o código-fonte de SqlInternalTransaction.Dispose
método (DbContextTransaction.Dispose
finalmente delegará a ele ao usar o provedor SqlServer):private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Veja, ele verifica se
_innerConnection
não é nulo, se não, reverta a transação (se confirmada, _innerConnection
será nulo). Vamos ver o que Commit
faz: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);
}
}