在不更新实体

时间:2017-11-02 05:23:02

标签: hibernate jpa locking optimistic-locking

以下是我用来获得乐观锁定的代码段。

setting = this.entityManager.find(Setting.class, id, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
setting.setUpdateTimestamp(new Date()); // I want to make sure that this setting is not changed by 
//any other module. So I am updating timestamp so that others will fail.
newSettingList.add(setting);

现在,有没有其他方法可以在不更新实体中的任何字段的情况下执行此操作,并确保没有其他模块在乐观锁定中更改该实体。

1 个答案:

答案 0 :(得分:0)

  

单独执行optimistic_force_increment是否确保在锁定进程提交之前其他进程不会更改数据?

取决于你的意思。 它对该实体持乐观态度。 根据定义,这意味着其他人可以自由地更改它,如果在您执行之前刷新他们的更改,甚至可以将其写回数据库。 如果他们这样做,您在尝试清除更改时会收到异常。

如果你在他们面前冲洗,他们就会得到例外。

如果你想在提交或回滚之前阻止任何人编写实体,你需要一个悲观的锁。

关于可重复读取,乐观锁提供以下保证(引自JPA规范):

  

P2(不可重复读取):事务T1读取一行。然后,另一个事务T2在T1提交之前修改或删除该行。两个事务最终都成功提交。

请注意,在两次事务提交之前都允许一切。

悲观锁定提供了这种保证:

  

P2(不可重复读取):事务T1读取一行。然后,另一个事务T2在T1提交或回滚之前修改或删除该行。

所以这里T2不允许在T1(持有锁的人)之前做出改变。

  

或者是否需要更新声明?

您不需要显式更新。 *FORCE_INCREMENT锁定类型包括版本列的更新。因此涉及到数据库的往返。

注意:我一直在写“flush”,因为我认为通常会发生异常,但规范允许在JPA实现的时候发生这种情况。

相关问题