2010-12-04 9 views
13

Si j'ai le code qui ressemble à ce qui suit:Mise en veille prolongée et les transactions et le verrouillage de table

beginTransaction(); 
// lots of stuff happens, can take anywhere from a minute to several minutes. 
// it will read from several tables via calling getter methods on lazy relationships. 
commitTransaction(); 

Entre le début et validation, sont les tables qui sont en cours de lecture d'être verrouillé et par la suite ce que cela cause des problèmes dans un environnement multi-utilisateurs où des problèmes se produiront lorsque le même code ci-dessus est appelé par un autre utilisateur?

Si ce qui précède est problématique, devrions-nous essayons toujours de garder les transactions à court? et pour faciliter cela, au lieu d'appeler des méthodes de getter sur des relations paresseuses, cela signifie-t-il qu'il est préférable de garder les transactions courtes et de faire des trouvailles manuellement pour les enfants des parents?

Répondre

18

Mise en veille prolongée ne va rien faire pour verrouiller explicitement les tables que vous lisez à partir. La réponse dépend vraiment de la base de données que vous utilisez et des niveaux d'isolation définis. Verrouiller une table complète en lisant les lignes ne devrait pas se produire dans toute base de données complète écrite dans ce siècle. Pour toute base de données multiversion, rien ne sera verrouillé à moins que vous ne verrouilliez explicitement la ligne vous-même.

Vos transactions devraient être tout longueur dont ils ont besoin d'être pour votre unité de travail atomique. Il n'y a pas de bonne ou de mauvaise longueur. Demandez-vous "tout ce qui arrive ici réussit-il ou échoue-t-il en tant qu'unité unique et tous sont-ils retournés ensemble si une seule pièce échoue?" C'est la portée pour laquelle vous définissez une transaction.

Rappelez-vous, vous n'avez pas besoin d'une opération pour avoir le chargement paresseux! Vous avez juste besoin d'une session ouverte. Les deux ne sont pas liés. Vous pouvez valider votre transaction et garder votre session ouverte pour que le chargement paresseux fonctionne.

4

La meilleure chose est de garder les transactions à court. La sémantique de verrouillage dépend cependant des niveaux d'isolation de la transaction.

Open Session In View est le modèle de votre recherchez quand vous parlez-paresseux/relations fetching.

Questions connexes