2012-04-12 1 views
11

J'ai une question sur le verrouillage optimiste dans Hibernate. J'essaie d'aller au fond d'un verrouillage optimiste avec Hibernate, mais j'ai un doute. Hibernate utilise l'approche de la version (entier ou timestamp) pour implémenter le verrouillage optimiste. Pour configurer, vous pouvez utiliser l'annotation @Version (ou la configuration xml) et créer un attribut de version. L'autre option consiste à configurer sans versioning en utilisant l'attribut optimistic-lock = "all".Verrouillage optimiste dans Hibernate par défaut

Ma question est dans le cas où vous ne définissez aucun attribut de versioning et vous ne spécifiez pas non plus un attribut optimistic-lock, quelle stratégie utilise Hibernate dans ce cas? Pessimistc Locking Je suis assez sûr que non, donc je suppose que c'est un verrouillage optimiste mais je ne sais pas comment.

Merci beaucoup pour votre attention.

Répondre

33

Si vous ne configurez pas Hibernate pour utiliser un verrouillage optimiste, il n'utilise aucun verrouillage. Donc, dans ce cas, la dernière mise à jour gagne toujours. Pour être clair, notez que le verrouillage optimiste Hibernate est complètement différent de l'isolation des transactions SGBD. Le verrouillage optimiste Hibernate ne fonctionne que lorsque vous chargez un objet dans une transaction, que vous le modifiez et que vous le sauvegardez ultérieurement dans une autre transaction. Dans ce cas, le verrouillage optimiste garantit que certaines autres transactions n'ont pas modifié cet objet dans la base de données. Toutefois, le verrouillage optimiste n'affecte pas l'isolation des transactions simultanées. Par conséquent, les verrous (optimistes ou pessimistes) utilisés par DBMS en interne pour implémenter l'isolation des transactions fonctionnent toujours, que le verrouillage Hibernate soit activé ou non.

3

@axtavt, vous avez raison, mais question de savoir comment hiberner implémenter le verrouillage optimiste sans colonne @Version.

Aujourd'hui quatre OptimisticLockType options disponibles:

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

Je pense que cela suffit pour répondre à la question initiale.

Questions connexes