Spring @Transactional 和 Hibernate @LockMode 注释有何关联

2022-09-02 12:41:46

我想知道交易和锁之间的关系。

更具体地说,Spring与Hibernate的LockMode有什么关系。https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.htmlhttp://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html@Transactional

如果我在创建会话对象时未指定任何锁定,并且与 as 一起使用,我是否使用悲观并发控件。@TransactionalreadOnlyfalse

如果有人能告诉我(乐观/悲观)并发控制和事务之间的关系,那将是一个很大的帮助。

谢谢你,维韦克


答案 1

和批注之间没有直接关系。@Transactional@LockMode

@Transactional用于标记RESOURCE_LOCAL或 JTA 事务的显式边界。您需要它的原因是每个数据库语句都在事务上下文中执行,并且,如果不设置事务边界,则每个语句或自动提交将获得一个事务。

另一方面,用于设置显式锁定选项。如果未设置,则将使用隐式锁定机制:@LockModeType

  • 在 2PL 和 MVCC 数据库引擎上的每个修改行上获取隐式锁。如果在可序列化上使用可重复读取,则会在 2PL 引擎上的读取记录上获取共享锁。
  • 如果定义了 @Version 属性,则将使用隐式乐观锁定机制。

因此,用于显式设置锁定选项,您可以具有以下选项:@LockModeType

锁定模式将始终在与锁定实体关联的表行上获取数据库锁定。PESSIMISTIC

还有明确的乐观锁定策略:

锁定模式旨在为您提供一种提升实体版本的方法,即使实体在当前运行的持久性上下文中未发生更改。当您需要使用其父实体版本协调多个子实体时,这是一个非常有用的机制。OPTIMISTIC

我在这个答案中提供的链接中有很多例子,所以花点时间,阅读它们,你会更详细地理解所有这些概念。


答案 2

Spring的和Hibernate的班级是不同的。@TransactionalLockMode

春季交易管理

@Transactional是声明性事务管理的Spring注释,即定义在数据库事务中一起执行的SQL语句。例如,使用该属性允许 Spring 在尝试在只读事务中插入行时引发异常。readOnly

但是,关于锁定,您很可能使用读/写 () 事务,因为您将尝试修改数据。readOnly = false

悲观锁定

Hibernate's用于悲观锁定,例如 实际执行一个语句,并锁定数据库中与实体对应的行。LockModeLockMode.UPGRADESELECT...FOR UPDATE

悲观锁定假定并发事务将相互冲突,并且要求在读取资源后锁定资源,并且仅在应用程序使用完数据后解锁资源。

乐观锁定

Hibernate 中的开放式并发控制通常使用数据库中的版本或时间戳列。这里的想法是,如果多个事务尝试同时修改一行,则除第一个已提交事务之外的所有事务都将检测到版本号已更改并执行回滚。

乐观锁定假定多个事务可以在不相互影响的情况下完成,因此事务可以在不锁定它们影响的数据资源的情况下继续进行。在提交之前,每个事务都会验证没有其他事务修改其数据。如果检查显示冲突的修改,则提交事务将回滚。

以上引用来自: https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html


推荐