Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rollback delle transazioni di Entity Framework 6

Non è necessario chiamare Rollback manualmente perché stai usando using dichiarazione.

DbContextTransaction.Dispose il metodo verrà chiamato alla fine di using bloccare. E eseguirà automaticamente il rollback della transazione se la transazione non viene eseguita correttamente (non sono state richiamate o riscontrate eccezioni). Di seguito è riportato il codice sorgente di SqlInternalTransaction.Dispose metodo (DbContextTransaction.Dispose alla fine delegherà ad esso quando si utilizza il provider SqlServer):

private void Dispose(bool disposing)
{
    // ...
    if (disposing && this._innerConnection != null)
    {
        this._disposing = true;
        this.Rollback();
    }
}

Vedi, controlla se _innerConnection non è nullo, in caso contrario, eseguire il rollback della transazione (se impegnata, _innerConnection sarà nullo). Vediamo cosa Commit fa:

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