我想知道事务和锁之间的关系。
更具体地说,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
,那么我是否使用悲观并发控件。
如果有人能告诉我(乐观/悲观)并发控制与事务之间的关系,那将是一个很大的帮助。
谢谢,
维维克
最佳答案
@Transactional
和@LockMode
批注之间没有直接关系。
@Transactional
用于标记RESOURCE_LOCAL或JTA事务的显式边界。之所以需要它,是因为每个数据库语句都在事务上下文中执行,并且,如果不设置事务边界,则每个语句或自动提交将获得一个事务。
另一方面,@LockModeType
用于设置显式锁定选项。如果未设置,则将使用隐式锁定机制:
@Version
属性,则将使用隐式乐观锁定机制。 因此,
@LockModeType
用于显式设置锁定选项 ,您可以使用以下选项:LockModeType.PESSIMISTIC_READ
LockModeType.PESSIMISTIC_WRITE
PESSIMISTIC
锁定模式将始终在与锁定实体关联的表行上获取数据库锁定。还有一些明确的乐观锁定策略:
LockModeType.OPTIMISTIC
LockModeType.OPTIMISTIC_FORCE_INCREMENT
LockModeType.PESSIMISTIC_FORCE_INCREMENT
OPTIMISTIC
锁定模式旨在为您提供一种提高实体版本的方法,即使该实体在当前运行的持久性上下文中没有发生变化。当您需要使用其父实体版本协调多个子实体时,这是一种非常有用的机制。我在此答案中提供的链接中有很多示例,请花点时间阅读所有内容,您将更详细地了解所有这些概念。