11.4. Verouillage pessimiste

Il n'est nécessaire de s'attarder à la stratégie de verrouillage des entités dans une application utilisant Hibernate. Il est généralement suffisant de définir le niveau d'isolation pour les connexions JDBC et de laisser ensuite la base de donnée effectuer son travail. Toutefois, certains utilisateurs avancés peuvent vouloir obtenir un verrouillage pessimiste exclusif sur un enregistrement et le réobtenir au lancement d'une nouvelle transaction.

Hibernate utilisera toujours le mécanisme de verrouillage de la base de données et ne verrouillera jamais les objets en mémoire!

La classe LockMode définit les différents niveaux de verrouillage pouvant être obtenus par Hibernate. Le verrouillage est obtenu par les mécanismes suivants:

Les niveaux de verrouillage peuvent être explicitement obtenus de l'une des manières suivantes:

Si Session.load() est appelé avec le paramètre de niveau de verouillage UPGRADE ou UPGRADE_NOWAIT et que l'objet demandé n'est pas présent dans la session, celui-ci sera chargé à l'aide d'une requête SELECT ... FOR UPDATE . Si la méthode load() est appelée pour un objet déjà en session avec un verrouillage moindre que celui demandé, Hibernate appellera la méthode lock() pour cet objet.

Session.lock() effectue une vérification de version si le niveau de verrouillage est READ , UPGRADE ou UPGRADE_NOWAIT . (Dans le cas des niveaux UPGRADE ou UPGRADE_NOWAIT , une requête SELECT ... FOR UPDATE sera utilisée.)

Si une base de données ne supporte pas le niveau de verrouillage demandé, Hibernate utilisera un niveau alternatif convenable au lieux de lancer une exception. Ceci assurera la portabilité de votre application.