sql >> Base de Datos >  >> RDS >> Sqlserver

Reversión de transacciones de Entity Framework 6

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