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

时间:2016-06-23 01:10:47

标签: java spring hibernate transactions locking

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

更具体地说,Spring的@Transactional与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使用readOnly作为false,我是否使用悲观的同步控制。

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

谢谢你, 的Vivek

2 个答案:

答案 0 :(得分:17)

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

this post中所述,@Transcational用于标记RESOURCE_LOCAL或JTA事务的显式边界。你需要它的原因是因为every database statement executes in a transactional context,如果你没有设置事务边界,你将得到每个语句一个事务或自动提交。

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

  • 在2PL和MVCC数据库引擎上的每个修改行上获取显式锁。如果您在Serializable上使用可重复读取,则会在2PL引擎上的读取记录上获取共享锁。
  • 如果您定义了@Version属性implicit optimistic locking mechanism will be used

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

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

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

答案 1 :(得分:2)

Spring的@Transactional和Hibernate的LockMode课程不同。

春季交易管理

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

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

悲观锁定

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

  

悲观锁定假定并发事务会发生冲突   相互之间,需要资源在它们之后被锁定   应用程序完成后,只读取并解锁   数据

乐观锁定

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

  

乐观锁定假定可以完成多个事务   而不会相互影响,因此交易可以   继续操作而不锁定它们影响的数据资源。之前   提交时,每个事务都会验证没有其他事务   修改了它的数据。如果支票显示相互矛盾的修改,那么   提交交易回滚。

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