2010-04-06 13 views
0

Lors de l'exécution d'un gestionnaire NServiceBus qui utilise NHibernate pour ses opérations d'accès aux données, je vois une erreur que je ne suis pas sûr si je dois être concernés par.« En utilisant une seule session dans plusieurs threads est probablement un bug » erreur dans NHProf lors de l'utilisation NServiceBus

Le gestionnaire a le code qui fait quelque chose comme ceci:

using (var tx = Session.BeginTransaction()) 
{ 
    var accountGroup = _groupRepository.FindByID(message.GroupID); 
    accountGroup.CreateAccount(message.AccountNumber); 

    tx.Commit(); 
} 

Quand je profil ce processus, je vois les lignes suivantes:

  • session, engagé dans la transaction distribuée avec le niveau d'isolement: Serializable
  • Début de la transaction avec le niveau d'isolement: Non spécifié
  • SELECT ... FROM AccountGroups this_ OERE this_.ID = 123
  • INSERT INTO comptes ...
  • commit transaction
  • commit transaction

Le premier message de validation est généré par mon code quand je l'appelle tx.Commit(). Le deuxième message de validation, je crois se produit lorsque nous quittons la méthode Handle du gestionnaire et est appelée par NServiceBus. Ce second appel à valider génère une alerte dans NHProf qui stipule que "Utiliser une seule session dans plusieurs threads est probablement un bug".

Je ne pense pas que ce soit un problème, car il n'y a vraiment rien à engager à ce moment-là, mais je suis en train de faire quelques-uns ici inapproprié? Je veux exécuter mon code dans une transaction, mais quand je le fais, je reçois cette alerte.

Des idées?

+0

Juste une remarque: NSB vous enveloppe manipuler avec un TransactionScope. Ceci + le fait que nhibernate supporte System.Transactions vous rend redondant Session.BeginTransaction(). Vous devriez être capable de l'enlever avec n'importe quel impact sur la cohérence. –

Répondre

2

Ce n'est pas un problème, ce qui se passe est que le professeur NH détecte que le DTC commit qui se passe dans un autre thread. Il devrait effectivement gérer les validations DTC correctement, donc je ne suis pas sûr de ce qui se passe. À la conjecture, en utilisant à la fois la validation DTC et la validation standard, il est confus. Je vais le réparer.

+0

Merci Ayende. J'ai supposé que c'était correct, mais j'ai trouvé cela étrange d'avoir quand même l'alerte. – SteveBering