默认情况下,在Hibernate中乐观锁定

时间:2012-04-12 08:10:14

标签: hibernate optimistic-locking

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

我的问题是你没有定义任何版本控制属性,也没有指定一个乐观锁属性,在这种情况下哪个策略使用Hibernate? Pessimistc Locking我很确定不行,所以我认为这是乐观锁定但不知道如何。

非常感谢你的关注。

2 个答案:

答案 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

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

相关问题