Comment TransactionScope roll back 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...
Certains 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 le txScope
objet de garder une trace de la 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(
) appels en l'entourant de mon code à l'aide de TransactionScope
?
Si non, comment puis ne TransactionScope
travail à faire reculer les transactions?
- Je n'ai jamais utilisé NHibernate, mais peut-être que ce lien va vous aider.
- Si vous êtes à la recherche à une meilleure façon de gérer votre NHibernate séances de groupe des opérations des opérations, vous voudrez peut-être consulter mon blog sur ce sujet dotnetchris.wordpress.com/2009/01/27/...
Vous devez vous connecter pour publier un commentaire.
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).
La
TransactionScope
de la classe fonctionne avec leOpération
de la classe, qui est de thread spécifique.Lorsque le
TransactionScope
est créé, il vérifie pour voir si il y a unTransaction
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 (puisqu'il faut l'appeler
Jetez
sur elle). Sur la dernière version, si leTransaction
n'était pas partie prenante, elle annule tout le travail.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
etemptAdapter
cas, vérifier pour voir si il y a une transaction en cours sur le fil (la statiqueActuelle
de la propriété sur leTransaction
classe). Si il y a, ensuite, il enregistre avec leTransaction
, de prendre part dans le commit/rollback séquence (quiTransaction
contrôles, et peut propager à divers transaction coordonnateurs, comme le noyau, distribué, etc.).