Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Reversão de transação do Entity Framework 6


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);
    }
}