JPA et optimiste modes de verrouillage
J'ai lu un article sur le blog de l'Oracle ici sur JPA et de verrouillage de modes.
Je ne suis pas tout à fait comprendre la différence entre OPTIMISTIC
et OPTIMISTIC_FORCE_INCREMENT
le mode de verrouillage des types.
OPTIMISTIC
mode :
Lorsqu'un utilisateur verrouille une entité avec ce mode, une vérification est effectuée sur le champ version de l'entité (@version
) au début de la transaction, et une vérification sur le champ version est également fait à la fin de la transaction. Si les versions sont différentes, la transaction est annulée.
OPTIMISTIC_FORCE_INCREMENT
mode :
Lorsqu'un utilisateur choisit ce mode, il a flush() l'état de l'EntityManager dans la base de données pour incrémenter le champ version manuellement. Ainsi, tous les autres optimiste transactions seront invalidés (roll back). De vérifier la version est également fait à la fin de l'opération de valider ou d'annuler la transaction.
Il semble clair, mais quand dois-je utiliser OPTIMISTIC
contre OPTIMISTIC_FORCE_INCREMENT
modes ? Le seul critère que je vois, c'est pour appliquer OPTIMISTIC_FORCE_INCREMENT
mode quand je veux la transaction ont la préséance sur les autres parce que le choix de ce mode de faire reculer toutes les autres transactions en cours d'exécution (si je comprends bien les mécanismes).
Est là une autre raison de choisir ce mode, plutôt que OPTIMISTIC
mode?
Grâce
- Je pense que nous utilisons utilisation OPTIMISTIC_FORCE_INCREMENT en cas de mise à jour de l'entité qui contient un autre type d'entités sur le terrain (@oneToOne, @oneToMany). Nous avons donc serrure avec OPTIMISTIC_FORCE_INCREMENT par exemple tous les ListItem lorsque l'on veut mettre à jour la Liste. Ainsi, au moment de la validation, nous nous assurons que toutes les entités liée à l'entité que nous voulons mettre à jour sont inchangés. N'est-ce pas ?
Vous devez vous connecter pour publier un commentaire.
Normalement, vous ne serait jamais utiliser le verrou() de l'API pour le verrouillage optimiste. JPA va automatiquement vérifier n'importe quelle version de colonnes sur la mise à jour ou supprimer.
Le seul but de la serrure() de l'API pour le verrouillage optimiste, c'est quand la mise à jour dépend d'un autre objet qui n'est pas modifié ou mis à jour. Cela permet à votre transaction afin de ne toujours pas si les autres modifications de l'objet.
Quand cela dépend de l'application et les cas d'utilisation. OPTIMISTE aura de l'autre objet n'a pas été mis à jour au moment de votre validation. OPTIMISTIC_FORCE_INCREMENT assurera l'autre objet n'a pas été mis à jour, et l'incrémenter sa version sur validation.
Verrouillage optimiste est toujours vérifiée lors de la validation, et il n'y a aucune garantie de succès jusqu'à sa validation. Vous pouvez utiliser la méthode flush() pour forcer les verrous de base de données à l'avance, ou déclencher une erreur antérieure.
Ne soyez pas effrayés par cette longue réponse. Ce sujet n'est pas simple.
Par défaut JPA imposer
Lire commis niveau d'isolation si vous ne précisez pas de verrouillage (même comportement que l'utilisation de
LockModeType.NONE
).Lire commis nécessite de la non-existence de la Sale lire phénomène. Simplement T1 ne peut voir les modifications apportées par T2 après T2 s'engage.
En utilisant le verrouillage optimiste en JPA s'élève le niveau d'isolation de
Repetable lit.
Si T1 lit des données au début et à la fin de la transaction, Repetable lit assure que T1 voit les mêmes données, même si T2 changé les données et commis dans le milieu de T1.
Et voici la partie la plus délicate. JPA réalise Repetable lit dans la manière la plus simple possible: par la prévention Non-Repetable lire phénomène. JPA n'est pas assez sophistiquée pour garder des instantanés de votre lit. Il empêche tout simplement de la deuxième lecture de passe en levant une exception (si les données ont changé depuis la première lecture).
Vous pouvez choisir entre deux optimiste options de verrouillage:
LockModeType.OPTIMISTIC
(LockModeType.READ
en JPA 1.0)LockModeType.OPTIMISTIC_FORCE_INCREMENT
(LockModeType.WRITE
en JPA 1.0)Quelle est la différence entre les deux?
Permettez-moi d'illustrer avec des exemples sur ce
Person
entité.Maintenant, nous supposons que nous avons une Personne nommée Jean stockées dans la base de données. Nous avons lu cette Personne en T1 mais changer son nom à Mike dans la deuxième transaction T2.
Sans verrouillage
Optimiste verrou en lecture
LockModeType.OPTIMISTIC_FORCE_INCREMENT
est utilisé lorsque la modification est apportée à une autre entité (peut-être un non-propriétaire de la relation) et que nous voulons préserver l'intégrité.Permettez-moi d'illustrer avec John acquisition d'une nouvelle voiture.
Optimiste verrou en lecture
Optimiste verrou d'écriture
Bien qu'il y est une suite de remarques dans la JPA spec, Hibernate et EclipseLink se comporte très bien et ne l'utilisez pas.
Person
est en effet de version comme premier ciselée indique.@Vesion
colonne surPerson
et il ne pourrait pas sur le verrouillage. Hibernate avec AssertionFailure: ne peut pas forcer la version de l'incrément sur la non-versionnées l'entité et Eclipselink avec PersistenceException: non Valide le mode de verrouillage de type pour une entité qui ne dispose pas d'une version à verrouillage de l'index. Seulement un verrouillage PESSIMISTE type de mode peut être utilisé lorsqu'il n'existe pas de version de verrouillage de l'index.persist
persister la collection de l'élément de l'entité, mais plutôt il suffit de l'insérer indirectement par la mise à jour de l'entité qui contient la collection. Estpersist
nécessaire ou superflue? Auriez-vous l'esprit d'avoir un coup d'oeil à ma question et donner une réponse, s'il vous plaît?Comme expliqué dans ce post,
LockModeType.OPTIMICTIC
souffre de vérifier la loi de questions, afin de vous mieux en le couplant avec un PESSIMISTIC_READ ou PESSIMISTIC_WRITE.D'autre part,
LockModeType.OPTIMICTIC_FORCE_INCREMENT
ne souffre d'aucune incohérence des données d'émission, et vous devez généralement utiliser pour contrôler la version d'une entité mère à chaque fois qu'un enfant entité est modifié.Découvrez cet article pour plus de détails de la façon dont vous pouvez utiliser
LockModeType.OPTIMICTIC_FORCE_INCREMENT
ouLockModeType.PESSIMISTIC_FORCE_INCREMENT
de sorte que l'entité mère version des contes de compte de l'entité enfant aussi bien les changements.