sql >> Databasteknik >  >> RDS >> Sqlserver

Entity Framework 6-transaktionsåterställning

Du behöver inte ringa Rollback manuellt eftersom du använder using påstående.

DbContextTransaction.Dispose metod kommer att anropas i slutet av using blockera. Och det kommer automatiskt att återställa transaktionen om transaktionen inte genomförs framgångsrikt (inte anropade eller påträffade undantag). Följande är källkoden för SqlInternalTransaction.Dispose metod (DbContextTransaction.Dispose kommer slutligen att delegera till det när du använder SqlServer-leverantören):

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

Du förstår, den kontrollerar om _innerConnection är inte null, om inte, återställ transaktionen (om den är genomförd, _innerConnection kommer att vara null). Låt oss se vad Commit gör:

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


  1. JSON_TABLE() Funktion i Oracle

  2. Kod för att validera SQL-skript

  3. Hur man återställer Amazon RDS Master User Password

  4. CONSTRAINT för att kontrollera värden från en fjärrrelaterade tabell (via join etc.)