sql >> Database >  >> RDS >> Sqlserver

Entity Framework 6 transactie terugdraaien

U hoeft Rollback niet te bellen handmatig omdat u de using . gebruikt uitspraak.

DbContextTransaction.Dispose methode wordt aan het einde van de using . aangeroepen blok. En het zal de transactie automatisch terugdraaien als de transactie niet succesvol is doorgevoerd (niet aangeroepen of uitzonderingen aangetroffen). Hieronder volgt de broncode van SqlInternalTransaction.Dispose methode (DbContextTransaction.Dispose zal er uiteindelijk aan delegeren bij gebruik van SqlServer-provider):

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

Zie je, het controleert of _innerConnection is niet null, zo niet, de transactie terugdraaien (indien vastgelegd, _innerConnection zal nul zijn). Laten we eens kijken wat Commit doet:

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. Wijzig de prioriteit van een account binnen een database-e-mailprofiel (SSMS)

  2. Hoe u uw ProxySQL kunt bewaken met Prometheus en ClusterControl

  3. Testen van Android SQLite-database-eenheden

  4. Hoe de DateTime()-functie werkt in SQLite