Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Restauration des transactions Entity Framework 6

Vous n'avez pas besoin d'appeler Rollback manuellement parce que vous utilisez le using déclaration.

DbContextTransaction.Dispose la méthode sera appelée à la fin du using bloc. Et il annulera automatiquement la transaction si la transaction n'est pas validée avec succès (exceptions non appelées ou rencontrées). Voici le code source de SqlInternalTransaction.Dispose méthode (DbContextTransaction.Dispose lui déléguera finalement lors de l'utilisation du fournisseur SqlServer):

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

Vous voyez, il vérifie si _innerConnection n'est pas nul, sinon, annuler la transaction (si validée, _innerConnection sera nul). Voyons ce que Commit fait :

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