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