我有一个关于Hibernate中乐观锁定的问题。我试图深入了解Hibernate的乐观锁定,但我有一个疑问。 Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要配置,您可以使用@Version注释(或xml配置)并创建版本属性。另一个选项是使用optimistic-lock =“all”属性进行配置而不进行版本控制。
我的问题是你没有定义任何版本控制属性,也没有指定一个乐观锁属性,在这种情况下哪个策略使用Hibernate? Pessimistc Locking我很确定不行,所以我认为这是乐观锁定但不知道如何。
非常感谢你的关注。
答案 0 :(得分:36)
如果不将Hibernate配置为使用乐观锁定,则根本不使用锁定。因此,在这种情况下,最后更新总是获胜。
为了说清楚,请注意Hibernate乐观锁定与DBMS事务隔离完全不同。 Hibernate乐观锁定只适用于在一个事务中加载对象,修改它并稍后在另一个事务中保存它的情况。在这种情况下,乐观锁定可确保某些其他事务未在数据库之间更改该对象。但是,乐观锁定不会影响并发事务的隔离 - 因此,无论是否启用了Hibernate锁定,DBMS内部用于实现事务隔离的锁定(乐观或悲观)仍然有效。
答案 1 :(得分:3)
@axtavt,你是对的,但是关于hibernate如何在没有@Version
列的情况下实现乐观锁定的问题。
今天提供了四种OptimisticLockType
选项:
/**
* Perform no optimistic locking.
*/
NONE,
/**
* Perform optimistic locking using a dedicated version column.
*
* @see javax.persistence.Version
*/
VERSION,
/**
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the
* UPDATE/DELETE SQL statement.
*/
DIRTY,
/**
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the
* UPDATE/DELETE SQL statement.
*/
ALL
我认为这足以回答原来的问题。