web-dev-qa-db-fra.com

Une instruction using annulera-t-elle une transaction de base de données si une erreur se produit?

J'ai une IDbTransaction dans une instruction using mais je ne sais pas si elle sera annulée si une exception est levée dans une instruction using. Je sais qu'une instruction using imposera l'appel de Dispose () ... mais quelqu'un sait-il si c'est la même chose pour Rollback ()?

pdate: Aussi, dois-je appeler explicitement Commit () comme je l'ai ci-dessous ou cela sera-t-il également pris en charge par l'instruction using?

Mon code ressemble un peu à ceci:

using Microsoft.Practices.EnterpriseLibrary.Data;

...

using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
    connection.Open();

    using(IDbTransaction transaction = connection.BeginTransaction())
    {
       //Attempt to do stuff in the database
       //potentially throw an exception
       transaction.Commit();
    }
}
80
mezoid

La méthode Dispose pour la classe de transaction effectue une restauration, contrairement à la classe Oracle. Du point de vue de la transaction, cela dépend donc de l'implémentation.

L'instruction using pour l'objet de connexion, d'autre part, fermerait la connexion à la base de données ou renverrait la connexion au pool après sa réinitialisation. Dans les deux cas, les transactions en cours doivent être annulées. C'est pourquoi une exception ne laisse jamais traîner une transaction active.

De plus, oui, vous devez appeler Commit() explicitement.

100
Sedat Kapanoglu

Vous devez appeler commit. L'instruction using n'engage rien pour vous.

19
jhale

Je crois que s'il y a une exception telle que Commit() n'a jamais été appelée, alors la transaction sera automatiquement annulée.

4
Tommy Hui