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

Entity Framework 6 transaktion rollback

Du behøver ikke at ringe til Rollback manuelt, fordi du bruger using udmelding.

DbContextTransaction.Dispose metode vil blive kaldt i slutningen af ​​using blok. Og det vil automatisk rulle transaktionen tilbage, hvis transaktionen ikke er gennemført (ikke kaldet eller stødt på undtagelser). Følgende er kildekoden til SqlInternalTransaction.Dispose metode (DbContextTransaction.Dispose vil endelig uddelegere til det, når du bruger SqlServer-udbyderen):

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

Ser du, den tjekker om _innerConnection er ikke null, hvis ikke, tilbagefør transaktionen (hvis den er forpligtet, _innerConnection vil være nul). Lad os se, hvad 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. Brug tekstoutput fra en funktion som ny forespørgsel

  2. brug kommandoen database_name i PostgreSQL

  3. enkelt fast tabel med flere kolonner vs fleksible abstrakte tabeller

  4. Oracle UNION-operatør forklaret