我读到我们可以使用@Version的版本字段在hibernate中实现乐观锁定。然后,在阅读有关悲观锁定的文章时,我开始了解到org.hibernate.LockMode类,它有一些我们可以在session.load()中指定的选项,比如LockMode.OPTIMISTIC等。
我的问题是,我是否需要在使用@Version的同时使用LockMode.OPTIMISTIC
发布于 2014-01-24 22:35:10
是。它们协同工作,你可以在没有LockMode.OPTIMISTIC的情况下使用@Version,但在没有@Version的情况下你不能使用LockMode.OPTIMISTIC。
使用乐观锁定时,无论何时修改实体,该实体的版本列都会递增。保存实体时,它会确保version列是第一次读取该实体时的版本,如果不是,它会抛出OptimisticLockException (这通常会导致重新启动事务)。
有时,您可能需要“更改”一个实体,而不是真正更改它。这往往是相当罕见的。例如,假设有一个具有mode字段的Foo对象和一个具有volume字段的Bar对象。如果mode为LOUD,则volume可以为0-100。如果mode为QUIET,则volume只能为0-10。
使用乐观锁定时,如果一个用户更改了mode (从LOUD更改为QUIET),同时另一个用户更改了volume (从5更改为50),您可能会处于糟糕的状态。这是因为第一个用户递增并检查Foo实体上的version列,第二个用户递增并检查Bar实体上的version列。
解决此问题的一种方法是让您的changeVolume函数获得Foo对象上的LockMode.OPTIMISTIC锁。这告诉Hibernate,即使此函数不修改Foo对象,它仍然需要递增并检查版本字段。
https://stackoverflow.com/questions/21332098
复制相似问题