Postgresql 选择JPA中的查询&;乐观锁

Postgresql 选择JPA中的查询&;乐观锁,postgresql,jpa,optimistic-locking,Postgresql,Jpa,Optimistic Locking,当我锁定了其他内容时,我对某个SELECT查询有问题。例如: 我在表1中的一个对象上设置了一个乐观\u FORCE\u INCREMENT锁,同时还有另一个事务包含表2上的SELECT查询表2没有任何数据库对象(外键或其他类型的约束)将其连接到表1。但是当第二个SELECT查询发生时,将抛出OptimisticLockException 有人知道为什么会发生这种情况吗?乐观锁异常(OLE)不太可能仅由选择查询引发。我想你在什么地方做了更新 使用乐观锁定时,实体通常具有版本列(由@version注

当我锁定了其他内容时,我对某个SELECT查询有问题。例如:

我在
表1
中的一个对象上设置了一个
乐观\u FORCE\u INCREMENT
锁,同时还有另一个事务包含
表2
上的SELECT查询<但是,代码>表2没有任何数据库对象(外键或其他类型的约束)将其连接到
表1
。但是当第二个SELECT查询发生时,将抛出
OptimisticLockException


有人知道为什么会发生这种情况吗?

乐观锁异常(OLE)不太可能仅由选择查询引发。我想你在什么地方做了更新

使用乐观锁定时,实体通常具有版本列(由
@version
注释标记)。OLE通常发生在要同步到数据库的实体过时时。例如(以下每个步骤是一个单独的db事务):

  • Bob从数据库中获取“用户”实体。现在,该用户的版本为1。然后将此用户实体传递到视图表单/用户界面进行编辑
  • 在Bob完成编辑之前,Sue还从数据库中获取相同的用户,对其进行更改并保存编辑,从而将版本标签增加到2
  • 当Bob试图保存他的更改时,JPA注意到用户实体的版本不再是1,他的用户版本过时,然后抛出OLE

  • 通常,最好的做法是捕获OLE,并向用户显示一条消息,这样说:“嘿,有人编辑了同一个实体并首先保存了。是否要覆盖/合并/丢弃您的更改?”

    是的,正如我之前所写,它发生在Select上,因此没有进行更新、删除或更改,它发生在与锁定的实体完全不同的实体上。您的实体是否有
    @Version
    列?我正在锁定的那个列是的。但为什么在SELECT查询中发生优化锁定?我认为应该把它扔到进行更新的事务中