2012-04-12 32 views
11

我有一个关于Hibernate中乐观锁定的问题。我试图深入与Hibernate进行乐观锁定,但我有一个疑问。 Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version注释(或xml配置)并创建一个版本属性。另一种选择是使用optimistic-lock =“all”属性进行配置而不使用版本控制。默认情况下在休眠状态下进行乐观锁定

我的问题是,如果你没有定义任何版本属性,也没有指定乐观锁属性,在这种情况下哪种策略使用Hibernate? Pessimistc锁定我非常肯定,不,所以我认为这是乐观锁定,但不知道如何。

非常感谢您的关注。

回答

33

如果您没有配置Hibernate使用乐观锁定,它根本不使用锁定。所以,在这种情况下,上次更新总是会获胜。

为了说清楚,请注意,Hibernate乐观锁定与DBMS事务隔离完全不同。 Hibernate乐观锁定仅适用于在一个事务中加载对象,修改它并稍后将其保存在另一个事务中的情况。在这种情况下,乐观锁确保其他一些事务没有改变数据库中的那个对象。但是,乐观锁定不会影响并发事务的隔离 - 因此,无论是否启用Hibernate锁定,DBMS内部用于实现事务隔离的锁定(乐观或悲观)仍然有效。

3

@axtavt,你说得对,但是如果没有@Version列,hibernate会实现乐观锁定的问题。可

今天4 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 

我认为这足以回答原来的问题。