web-dev-qa-db-fra.com

JPA et modes de verrouillage optimistes

J'ai lu un article sur le blog d'Oracle ici à propos de JPA et des modes de verrouillage.

Je ne comprends pas tout à fait la différence entre les types de mode de verrouillage OPTIMISTIC et OPTIMISTIC_FORCE_INCREMENT.

mode OPTIMISTIC:

enter image description here

Lorsqu'un utilisateur verrouille une entité avec ce mode, une vérification est effectuée sur l'entité de champ de version (@version) au début de la transaction et une vérification sur le champ de version est également effectuée à la fin de la transaction. Si les versions sont différentes, la transaction est annulée.

OPTIMISTIC_FORCE_INCREMENT mode:

enter image description here

Lorsqu'un utilisateur choisit ce mode, il doit vider l'état d'EntityManager dans la base de données pour incrémenter manuellement le champ de version. Ainsi, toutes les autres transactions optimistes seront invalidées (annulées). Une vérification de la version est également effectuée à la fin de la transaction pour valider ou annuler la transaction.

Cela semble clair, mais quand devrais-je utiliser les modes OPTIMISTIC par rapport à OPTIMISTIC_FORCE_INCREMENT? Le seul critère que je vois est d'appliquer le mode OPTIMISTIC_FORCE_INCREMENT lorsque je souhaite que la transaction soit prioritaire sur les autres, car le choix de ce mode annulera toutes les autres transactions en cours d'exécution (si je comprends bien le mécanisme).

Existe-t-il une autre raison de choisir ce mode plutôt que le mode OPTIMISTIC?

Merci

19
Olivier J.

Normalement, vous n'utiliseriez jamais l'API lock () pour un verrouillage optimiste. JPA vérifiera automatiquement les colonnes de version de toute mise à jour ou suppression.

Le seul but de l'API lock () pour le verrouillage optimiste est lorsque votre mise à jour dépend d'un autre objet qui n'est pas modifié/mis à jour. Cela permet à votre transaction d’échouer quand même si l’autre objet change.

Quand faire cela dépend de l'application et du cas d'utilisation. OPTIMISTIC s'assurera que l'autre objet n'a pas été mis à jour au moment de votre validation. OPTIMISTIC_FORCE_INCREMENT s'assurera que l'autre objet n'a pas été mis à jour et incrémentera sa version lors de la validation.

Le verrouillage optimiste est toujours vérifié lors de la validation, et rien ne garantit son succès avant la validation. Vous pouvez utiliser flush () pour forcer les verrous de la base de données à l’avance ou pour déclencher une erreur antérieure.

11
James

Comme expliqué dans cet article , LockModeType.OPTIMICTIC souffre de problèmes de vérification de l'acte, de sorte que vous êtes mieux le coupler avec un PESSIMISTIC_READ ou PESSIMISTIC_WRITE .

D'autre part, LockModeType.OPTIMICTIC_FORCE_INCREMENT ne souffre d'aucun problème d'incohérence dans les données et vous l'utiliseriez généralement pour contrôler la version d'une entité parente chaque fois qu'une entité enfant est modifiée.

Consultez cet article pour plus de détails sur l'utilisation de LockModeType.OPTIMICTIC_FORCE_INCREMENT ou LockModeType.PESSIMISTIC_FORCE_INCREMENT afin que la version de l'entité parent soit prise en compte par l'entité enfant.

0
Vlad Mihalcea