3

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

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

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

4

1 回答 1

1

OptimisticLockException (OLE) 不太可能仅由选择查询引发。我假设您确实在某处进行了更新。

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

  1. Bob 从数据库中获取一个“用户”实体。按照现在这个用户的版本是 1。这个用户实体然后被传递到一个视图表单/用户界面进行编辑。
  2. 在 Bob 完成编辑之前,Sue 还从数据库中获取了相同的用户,进行了更改并保存了她的编辑,因此将版本标签增加到 2
  3. 当 Bob 试图保存他的更改时,JPA 注意到用户实体的版本不再是 1,他的用户版本已经过时,然后抛出 OLE

通常最好的办法是捕获 OLE,然后向用户显示一条消息,内容大致如下:“嘿,有人编辑了同一个实体并先保存。你想覆盖/合并/丢弃你的更改吗?”

于 2013-07-05T06:30:34.360 回答