96 votes

Comment TransactionScope annule-t-il les transactions?

Je suis en train d'écrire un test d'intégration où je serai l'insertion d'un certain nombre d'objets dans une base de données, puis de vérifier si ma méthode récupère les objets.

Ma connexion à la base de données est par NHibernate...et ma méthode habituelle de la création d'un tel test serait de faire ce qui suit:

NHibernateSession.BeginTransaction();

//use nhibernate to insert objects into database
//retrieve objects via my method
//verify actual objects returned are the same as those inserted

NHibernateSession.RollbackTransaction();

Cependant, j'ai récemment découvert sur TransactionScope qui, apparemment, peut être utilisé à cet effet...

Quelques exemple de code que j'ai trouvé est comme suit:

public static int AddDepartmentWithEmployees(Department dept)
{

    int res = 0;

    DepartmentAdapter deptAdapter = new DepartmentAdapter();
    EmployeeAdapter empAdapter = new EmployeeAdapter();
    using (TransactionScope txScope = new TransactionScope())
    {

        res += deptAdapter.Insert(dept.DepartmentName);
        //Custom method made to return Department ID 
        //after inserting the department "Identity Column"
        dept.DepartmentID = deptAdapter.GetInsertReturnValue();
        foreach(Employee emp in dept.Employees)
        {

            emp.EmployeeDeptID = dept.DepartmentID;
            res += empAdapter.Insert(emp.EmployeeName, emp.EmployeeDeptID);

        }
        txScope.Complete();

    }
    return res;

}

Je crois que si je ne comprend pas la ligne txScope.Complete() que les données insérées seront annulées. Mais malheureusement je ne comprends pas comment c'est possible... comment l' txScope objet de garder une trace de l' deptAdapter et empAdapter des objets et de leurs transactions sur la base de données.

Je sens que je manque un peu d'informations ici...suis-je vraiment capable de remplacer ma BeginTransaction() et RollbackTransaction() des appels en l'entourant de mon code à l'aide d' TransactionScope?

Si non, comment ne puis - TransactionScope travail à faire reculer les transactions?

106voto

JoshBerke Points 34238

Essentiellement TransactionScope n'assure pas le suivi de votre Adaptateur, ce qu'il fait est-il des pistes de connexions de base de données. Lorsque vous ouvrez une connexion DB connexions regarde si il y a une ambiance de transaction (Transaction Champ d'application) et si donc faire appel à elle. Attention si il y a plus d'une connexion à SQL server, cela va dégénérer en Distribtued Transaction.

Ce qui se passe depuis que vous utilisez un bloc using vous assurer de disposer va être appelé même si une exception se produit. Donc, si dispose est appelé avant txScope.Complet() TransactionScope va dire les connexions à la restauration de leurs transactions (ou de la DTC).

52voto

casperOne Points 49736

L' TransactionScope de la classe travaille avec l' Transaction classe, qui est de thread spécifique.

Lorsque l' TransactionScope est créé, il vérifie pour voir si il y a un Transaction pour le fil, si il en existe un, il utilise alors que, sinon, il en crée un nouveau et pousse sur la pile.

Si il utilise un existant, puis il incrémente un compteur pour les rejets (puisque vous appelez Dispose ). Sur la dernière version, si l' Transaction n'a pas été partie prenante, elle annule tout le travail.

Comme pour laquelle les classes semblent comme par magie savoir sur les transactions, c'est-à gauche comme un détail d'implémentation pour les classes qui souhaitent travailler avec ce modèle.

Lorsque vous créez votre deptAdapter et emptAdapter des cas, ils vérifient pour voir si il y a une transaction en cours sur le fil (la statique Current de la propriété sur l' Transaction de la classe). Si il y a, ensuite, il enregistre avec l' Transaction, afin de prendre part dans le commit/rollback séquence ( Transaction des contrôles, et peut propager à divers transaction coordonnateurs, comme le noyau, distribué, etc.).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X