Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@hibernate中的版本,在群集环境中运行时不起作用…(乐观锁)_Hibernate_Concurrency_Version_Cluster Computing_Optimistic Locking - Fatal编程技术网

@hibernate中的版本,在群集环境中运行时不起作用…(乐观锁)

@hibernate中的版本,在群集环境中运行时不起作用…(乐观锁),hibernate,concurrency,version,cluster-computing,optimistic-locking,Hibernate,Concurrency,Version,Cluster Computing,Optimistic Locking,我有一个实体在它的一个字段上使用@version,我想实现,如果两个事务同时修改这个实体,一个将失败(并获得乐观锁异常),另一个将成功 当我在单个JVM上运行此测试时,效果很好,但是当我在集群环境中运行时,两个事务成功,并且没有抛出乐观锁 public class DeploymentLock { @Column(name = "DEPLOYMENT_COUNTER") private Long deploymentCounter; @Version @Co

我有一个实体在它的一个字段上使用@version,我想实现,如果两个事务同时修改这个实体,一个将失败(并获得乐观锁异常),另一个将成功

当我在单个JVM上运行此测试时,效果很好,但是当我在集群环境中运行时,两个事务成功,并且没有抛出乐观锁

public class DeploymentLock  {

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

    @Version
    @Column(name = "ENTITY_VERSION")
    private Long version;
    ...
}
我错过什么了吗?我需要在@Version下使用“@Generated(GenerationTime.ALWAYS)”吗

顺便说一下,我在我的应用程序中使用Spring和hibrnate。。。
有什么想法吗?

如果在两个不同的hibernate会话(通常在两个不同的JVM或两个不同的主机上)中有两个
部署锁的实例,每个都具有相同的
版本
值,那么调用的第二个更新应该抛出
HibernateOptimisticLockingFailureException

基本上,hibernate正在执行以下操作:

UPDATE DeploymentLock SET deploymentCounter = ..., version = 2 WHERE version = 1
然后,如果更新没有更改行,则引发异常

您确定两个不同的JVM(或两个会话)具有相同的
version
值的相同实例吗?是不是有一个
refresh()
在您不期望的地方,或者可能是竞争条件导致第二个实例查询返回更新的
DeploymentLock


可能会添加一些日志记录或
println
调试,以便在更新之前打印版本值。如果它确实显示版本相同,那么您可以编辑您的帖子来显示您是如何进行更新调用的吗?

您是否有一些关于集群环境中JPA/Hibernate锁的文档?