@hibernate中的版本,在群集环境中运行时不起作用…(乐观锁)
我有一个实体在它的一个字段上使用@version,我想实现,如果两个事务同时修改这个实体,一个将失败(并获得乐观锁异常),另一个将成功 当我在单个JVM上运行此测试时,效果很好,但是当我在集群环境中运行时,两个事务成功,并且没有抛出乐观锁@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
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锁的文档?