viv*_*348 14 java spring hibernate locking transactions
我想知道交易和锁之间的关系.
更具体地说,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
如果我不同时创建Session对象指定任何锁,并使用@Transactional与readOnly作为false,我使用悲观Concurrenct控制.
如果有人能告诉我(乐观/悲观)并发控制和事务之间的关系,那将是一个很大的帮助.
谢谢Vivek
Vla*_*cea 18
注释与注释之间没有直接关系.@Transactional@LockMode
正如在解释这个帖子,@Transcational是用来标记RESOURCE_LOCAL或JTA事务的明确界限.您需要它的原因是因为每个数据库语句都在事务上下文中执行,如果您没有设置事务边界,您将获得每个语句或自动提交一个事务.
另一方面,@LockMode用于设置显式锁定选项.如果未设置,将使用隐式锁定机制:
@Version属性,则将使用隐式乐观锁定机制.因此,@LockMode用于显式设置锁定选项,您可以使用以下选项:
LockModeType.OPTIMISTICLockModeType.OPTIMISTIC_FORCE_INCREMENTLockModeType.PESSIMISTIC_FORCE_INCREMENTLockModeType.PESSIMISTIC_READLockModeType.PESSIMISTIC_WRITE该PESSIMISTIC锁模式将始终掌握在与该锁定实体相关联的表行数据库锁.该OPTIMISTIC锁模式是为了给你撞了,即使实体并没有在当前运行的持久化上下文变化的实体版本的方式.当您需要使用其父实体版本协调多个子实体时,这是一种非常有用的机制.
我在这个答案中提供的链接中有很多例子,所以请花点时间阅读所有这些,你会更详细地理解所有这些概念.
Spring@Transactional和 Hibernate 的LockMode类是不同的。
Spring事务管理
@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
| 归档时间: | 
 | 
| 查看次数: | 20496 次 | 
| 最近记录: |