2

J'ai une entité qui utilise @version sur l'un de ses champs, je veux réaliser que si deux transactions modifient cette entité dans la en même temps, on échouera (et obtiendrez Optimistic Lock Exception) et l'autre réussira.@Version en veille prolongée, lors de l'exécution dans env cluster ne fonctionne pas ... (verrouillage Optimiste)

quand je lance ce test sur une seule machine virtuelle Java cela fonctionne très bien, mais quand je lance dans un env cluster, réussir et No Lock Optimiste est jeté les deux transactions.

public class DeploymentLock { 

    @Column(name = "DEPLOYMENT_COUNTER") 
    private Long deploymentCounter; 

    @Version 
    @Column(name = "ENTITY_VERSION") 
    private Long version; 
    ... 
} 

suis-je manque quelque chose? dois-je utiliser "@Generated (GenerationTime.ALWAYS)" sous @Version?

Im avec Spring et hibrnate dans mon application par la façon ... une idée?

Répondre

1

Si vous avez deux instances de DeploymentLock à l'intérieur de deux différentes sessions de mise en veille prolongée (habituellement en deux JVMs différentes ou sur deux hôtes différents) chacun avec la même valeur version, le 2 des mises à jour que vous appelez doit jeter HibernateOptimisticLockingFailureException .

veille prolongée Fondamentalement fait quelque chose comme:

UPDATE DeploymentLock SET deploymentCounter = ..., version = 2 WHERE version = 1 

Ensuite, si la mise à jour n'a pas changé la ligne l'exception est levée. Etes-vous sûr que les deux JVM (ou deux sessions) différentes ont la même instance avec la même valeur version? Se pourrait-il qu'il y ait un refresh() quelque part où vous ne vous attendez pas ou peut-être que les conditions de course provoquent la requête de 2ème instance renvoyer la mise à jour DeploymentLock?

Peut-être ajouter une journalisation ou println débogage pour imprimer la valeur de la version juste avant la mise à jour. Si cela montre que les versions sont les mêmes, pouvez-vous modifier votre message pour montrer comment vous effectuez l'appel de mise à jour?

+0

Avez-vous une documentation à propos de Lock JPA/Hibernate dans un environnement de cluster? –

Questions connexes