使用@Version或LockMode.OPTIMISTIC或两者在Hibernate中实现乐观锁定

时间:2014-01-24 11:58:37

标签: java hibernate optimistic-locking

我读到我们可以使用@Version使用版本字段在hibernate中实现乐观锁定。然后在阅读关于悲观锁定时,我开始知道org.hibernate.LockMode类有LockMode.OPTIMISTIC之类的选项,我们可以在session.load()中指定。

所以我的问题是我是否需要LockMode.OPTIMISTIC以及@Version

1 个答案:

答案 0 :(得分:0)

是。他们一起工作,您可以在没有@Version的情况下使用LockMode.OPTIMISTIC,但如果没有LockMode.OPTIMISTIC则无法使用@Version

使用乐观锁定,无论何时修改实体,实体的版本列都会递增。保存实体时,它确保版本列是第一次读取实体时的版本,如果不是,则会抛出OptimisticLockException(通常会导致重新启动事务)。

有时候你需要“改变”一个实体而不真正改变它。这往往很少见。例如,假设有Foo个对象,其中mode字段和Bar对象具有volume字段。如果modeLOUD,则volume可以为0-100。如果modeQUIET,则volume只能为0-10。

如果一个用户将mode(从LOUD更改为QUIET),同时另一个用户更改{{{},则可以通过乐观锁定使您处于错误状态1}}(从5到50)。这是因为第一个用户递增并检查volume实体上的版本列,第二个用户递增并检查Foo实体上的版本列。

一个解决方案就是让Bar函数在changeVolume对象上获得LockMode.OPTIMISTIC锁定。这告诉Hibernate即使这个函数没有修改Foo对象,它仍然需要递增并检查版本字段。