当锁定其他内容时,我对某个SELECT查询有问题。例如:
我在OPTIMISTIC_FORCE_INCREMENT
中为一个对象设置了Table 1
锁,同时还有一个事务包含了对Table 2
的SELECT查询。但是,Table 2
没有任何数据库对象(外键或其他类型的约束)将其连接到Table 1
。但是当第二个SELECT查询发生时,会抛出OptimisticLockException
。
有人知道为什么会这样吗?
最佳答案
OptimisticLockException(OLE)不太可能只由select查询引发。我想你是在什么地方做了更新。
使用乐观锁定时,通常实体具有版本列(用@Version
注释标记)。OLE通常发生在要同步到数据库的实体过时时。例如(下面的每个步骤是一个单独的数据库事务):
Bob从数据库中获取“user”实体。目前,此用户的版本为1。然后,该用户实体被传递到视图窗体/用户界面进行编辑。
在Bob完成编辑之前,Sue还从数据库中获取同一用户,对其进行更改并保存其编辑,因此版本标签增加到2
当Bob试图保存他的更改时,JPA注意到用户实体的版本不再是1,用户的版本已经过时,然后抛出OLE
通常最好的做法是捕获OLE,然后向用户呈现一条消息,告诉用户:“嘿,有人编辑了同一个实体,并首先保存了它。是否覆盖/合并/放弃更改?“
关于postgresql - JPA中的SELECT查询和乐观锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17476930/