JPA&中的SELECT查询乐观锁定

时间:2013-07-04 19:17:35

标签: postgresql jpa optimistic-locking

当我有其他锁定的东西时,我遇到某个SELECT查询的问题。例如:

我在OPTIMISTIC_FORCE_INCREMENT中的一个对象上设置了Table 1锁定,同时在Table 2上有另一个包含SELECT查询的事务。但是,Table 2没有任何将其连接到Table 1的数据库对象(外键或其他类型的约束)。但是当第二个SELECT查询发生时,抛出OptimisticLockException

有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

不太可能只有select查询抛出OptimisticLockException(OLE)。我假设你确实在某处做了更新。

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

  1. Bob从数据库中获取“用户”实体。目前,该用户的版本为1.然后,此用户实体将传递到视图表单/用户界面进行编辑。
  2. 在Bob完成编辑之前,Sue还从数据库中获取相同的用户,进行了更改并保存了她的编辑,因此将版本标签增加到2
  3. 当Bob试图保存他的更改时,JPA注意到用户实体的版本不再是1,他的用户版本是陈旧的,然后抛出OLE
  4. 通常,最好的办法是捕获OLE,并向用户显示一条消息:“嘿,有人编辑了同一个实体并先保存。你想覆盖/合并/抛弃你的变化吗? “