Java 在Hibernate中使用@Version或LockMode.Optimistic或两者都实现乐观锁定
我读到,我们可以使用Java 在Hibernate中使用@Version或LockMode.Optimistic或两者都实现乐观锁定,java,hibernate,optimistic-locking,Java,Hibernate,Optimistic Locking,我读到,我们可以使用@version在hibernate中使用version字段实现乐观锁定。然后在阅读了有关悲观锁定的内容后,我了解到,org.hibernate.LockMode类有一些选项,如LockMode.OPTIMISTIC等,我们可以在session.load()中指定这些选项 所以我的问题是我是否需要使用锁模式。乐观的以及版本?是的。它们一起工作,您可以使用@Version而不使用LockMode.OPTIMISTIC,但不能使用LockMode.OPTIMISTIC而不使用@V
@version
在hibernate中使用version字段实现乐观锁定。然后在阅读了有关悲观锁定的内容后,我了解到,org.hibernate.LockMode
类有一些选项,如LockMode.OPTIMISTIC
等,我们可以在session.load()
中指定这些选项
所以我的问题是我是否需要使用锁模式。乐观的以及版本?是的。它们一起工作,您可以使用
@Version
而不使用LockMode.OPTIMISTIC
,但不能使用LockMode.OPTIMISTIC
而不使用@Version
使用乐观锁定,无论何时修改实体,该实体的版本列都会递增。保存实体时,它确保版本列与第一次读取实体时相同,如果没有,则抛出OptimisticLockException
(这通常会导致事务重新启动)
有时,您可能需要“更改”实体而不真正更改它。这往往是相当罕见的。例如,假设有一个Foo
对象,它有一个mode
字段和一个Bar
对象,它有一个volume
字段。如果模式
为响亮
音量可以为0-100。如果模式
为静音
则音量
只能为0-10
如果一个用户将模式
(从大声
更改为安静
),同时另一个用户将音量
(从5更改为50),则乐观锁定可能会使您处于不良状态。这是因为第一个用户增加并检查Foo
实体上的版本列,而第二个用户增加并检查Bar
实体上的版本列
一种解决方案是让changeVolume
函数在Foo
对象上获得LockMode.OPTIMISTIC
锁。这告诉Hibernate,即使此函数不修改Foo
对象,它仍然需要递增并检查版本字段