Spring @Transactional和Hibernate @LockMode注释是如何相关的

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

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

如果我在创建会话对象时没有指定任何锁定,并将@TransactionalreadOnly一起使用为false ,我是否使用悲观的Concurrenct Control。

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

谢谢Vivek

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

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

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

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

因此, @LockMode用于显式设置锁定选项,您可以使用以下选项:

  • LockModeType.OPTIMISTIC
  • LockModeType.OPTIMISTIC_FORCE_INCREMENT
  • LockModeType.PESSIMISTIC_FORCE_INCREMENT
  • LockModeType.PESSIMISTIC_READ
  • LockModeType.PESSIMISTIC_WRITE

PESSIMISTIC锁定模式将始终在与锁定实体关联的表行上获取数据库锁定。 OPTIMISTIC锁定模式旨在为您提供一种方法来提升实体版本,即使实体在当前运行的持久性上下文中没有更改。 当您需要使用其父实体版本协调多个子实体时,这是一种非常有用的机制。

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

Spring的@Transactional和Hibernate的LockMode类是不同的。

春季交易管理

@Transactional是声明式事务管理的Spring注释,即定义在数据库事务中一起执行的SQL语句。 例如,如果您尝试在只读事务中插入行,则使用readOnly属性允许Spring抛出exception。

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

悲观锁定

Hibernate的LockMode用于悲观锁定,例如LockMode.UPGRADE实际执行SELECT...FOR UPDATE语句,并锁定数据库中对应于该实体的行。

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

乐观锁定

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

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

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