我读到我们可以使用@Version
使用版本字段在hibernate中实现乐观锁定。然后在阅读关于悲观锁定时,我开始知道org.hibernate.LockMode
类有LockMode.OPTIMISTIC
之类的选项,我们可以在session.load()
中指定。
所以我的问题是我是否需要LockMode.OPTIMISTIC
以及@Version
?
答案 0 :(得分:0)
是。他们一起工作,您可以在没有@Version
的情况下使用LockMode.OPTIMISTIC
,但如果没有LockMode.OPTIMISTIC
则无法使用@Version
。
使用乐观锁定,无论何时修改实体,实体的版本列都会递增。保存实体时,它确保版本列是第一次读取实体时的版本,如果不是,则会抛出OptimisticLockException
(通常会导致重新启动事务)。
有时候你需要“改变”一个实体而不真正改变它。这往往很少见。例如,假设有Foo
个对象,其中mode
字段和Bar
对象具有volume
字段。如果mode
为LOUD
,则volume
可以为0-100。如果mode
为QUIET
,则volume
只能为0-10。
如果一个用户将mode
(从LOUD
更改为QUIET
),同时另一个用户更改{{{},则可以通过乐观锁定使您处于错误状态1}}(从5到50)。这是因为第一个用户递增并检查volume
实体上的版本列,第二个用户递增并检查Foo
实体上的版本列。
一个解决方案就是让Bar
函数在changeVolume
对象上获得LockMode.OPTIMISTIC
锁定。这告诉Hibernate即使这个函数没有修改Foo
对象,它仍然需要递增并检查版本字段。