Hibernate默认使用乐观锁机制实现并发控制。

22

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

我的问题是,在不定义任何版本控制属性的情况下,也不指定optimistic-lock属性的情况下,Hibernate使用哪种策略? 悲观锁定我很确定不会使用,因此我认为这是乐观锁定,但不知道如何操作。

非常感谢您的关注。

2个回答

52

如果您没有配置Hibernate使用乐观锁定,则根本不会使用任何锁定。因此,在这种情况下,最后一次更新总是获胜。

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


4

@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

我认为这已经足够回答原问题了。


你能详细说明每个选项吗? - gstackoverflow
我觉得Javadoc非常自解释。你对某个特定选项有疑问吗? - Ruslan
我已经阅读了用户指南,现在我明白了。如果有人感兴趣,请访问 https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#locking-optimistic - gstackoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接