我想知道交易和锁之间的关系。
更具体地说,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
如果我在创建会话对象时没有指定任何锁定,并且@Transactional
使用readOnly
作为false
,我是否使用悲观的同步控制。
如果有人能告诉我(乐观/悲观)并发控制和交易之间的关系,那将是一个很大的帮助。
谢谢你, 的Vivek
答案 0 :(得分:17)
@Transactional
和@LockMode
注释之间没有直接关系。
如this post中所述,@Transcational
用于标记RESOURCE_LOCAL或JTA事务的显式边界。你需要它的原因是因为every database statement executes in a transactional context,如果你没有设置事务边界,你将得到每个语句一个事务或自动提交。
另一方面,@LockMode
用于设置显式锁定选项。如果不设置,将使用隐式锁定机制:
@Version
属性implicit optimistic locking mechanism will be used。因此,@LockMode
用于设置锁定选项显式,您可以选择以下选项:
LockModeType.OPTIMISTIC
LockModeType.OPTIMISTIC_FORCE_INCREMENT
LockModeType.PESSIMISTIC_FORCE_INCREMENT
LockModeType.PESSIMISTIC_READ
LockModeType.PESSIMISTIC_WRITE
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