Comment verrouiller les objets avant de les mettre à jour à l'aide de NHibernate modes de verrouillage?

Donc d'abord permettez-moi de préciser ce que j'essaie d'accomplir. J'ai une table qui est rempli avec des emplois. Et il y a un service web avec une méthode qui permet la modification des données de la tâche appelée SaveJob. Cette méthode récupère le travail et toutes ses données, exécute des validations (qui nécessitent certaines requêtes db de leur propre à d'autres tables) sur les nouvelles données, puis l'enregistre dans la base de données. C'est un peu lent. Environ une seconde.

Ce qui se passe parfois deux SaveJob appels seront effectués à proximité sur le même travail et ils vont courir les uns sur les autres. Actuellement c'est le seul serveur web, mais je voudrais avoir ma solution web de batterie compatible, donc même si je suis conscient de la façon de résoudre ce problème à l'aide d'un singleton, je préfère avoir les serrures géré par la base de données.

La question est puis-je utiliser NHibernate et base de données SQL Server serrures pour obtenir une deuxième SaveJob appel à bloc quand il essaie de lire un Travail qui est déjà en cours de modification par un autre SaveJob appel?

Je crois que la réponse est oui, mais je ne suis pas vraiment sûr de savoir comment aller à ce sujet. J'ai lu la documentation sur le ISession.Lock() et je crois que ce dont j'ai besoin est d'utiliser le NHibernate.LockMode.Upgrade

Ma prochaine question est de savoir quand est-ce verrou libérée?

Je suppose qu'il est libéré lorsque la transaction est validée, mais je ne trouve pas la documentation qui l'affirme explicitement.

Cependant, si c'est le cas, alors il est un moyen pour moi d'ouvrir une autre transaction et exécutez des requêtes sans la clôture de la transaction, j'ai commencé lorsque j'ai attrapé le travail en premier lieu? Ou dois-je ont à faire tout cela en une seule transaction?

OriginalL'auteur Spencer Ruport | 2013-08-21