Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entity Framework 6-Transaktionsrollback

Sie müssen Rollback nicht aufrufen manuell, da Sie den using verwenden Erklärung.

DbContextTransaction.Dispose Methode wird am Ende des using aufgerufen Block. Und es wird die Transaktion automatisch zurücksetzen, wenn die Transaktion nicht erfolgreich festgeschrieben wurde (nicht aufgerufen oder aufgetretene Ausnahmen). Es folgt der Quellcode von SqlInternalTransaction.Dispose Methode (DbContextTransaction.Dispose wird bei Verwendung des SqlServer-Anbieters schließlich daran delegiert):

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

Sie sehen, es prüft, ob _innerConnection nicht null ist, falls nicht, setzen Sie die Transaktion zurück (falls festgeschrieben, _innerConnection wird null sein). Mal sehen, was Commit ist tut:

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