我想知道事务和锁之间的关系。

更具体地说,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 对象时未指定任何锁定,并且将@TransactionalreadOnly用作false,那么我是否使用悲观并发控件。

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

谢谢,
维维克

最佳答案

@Transactional@LockMode批注之间没有直接关系。
@Transactional 用于标记RESOURCE_LOCAL或JTA事务的显式边界。之所以需要它,是因为每个数据库语句都在事务上下文中执行,并且,如果不设置事务边界,则每个语句或自动提交将获得一个事务。
另一方面,@LockModeType用于设置显式锁定选项。如果未设置,则将使用隐式锁定机制:

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

  • 因此,@LockModeType用于显式设置锁定选项 ,您可以使用以下选项:
  • LockModeType.PESSIMISTIC_READ
  • LockModeType.PESSIMISTIC_WRITE
  • PESSIMISTIC锁定模式将始终在与锁定实体关联的表行上获取数据库锁定。
    还有一些明确的乐观锁定策略:
  • LockModeType.OPTIMISTIC
  • LockModeType.OPTIMISTIC_FORCE_INCREMENT
  • LockModeType.PESSIMISTIC_FORCE_INCREMENT
  • OPTIMISTIC锁定模式旨在为您提供一种提高实体版本的方法,即使该实体在当前运行的持久性上下文中没有发生变化。当您需要使用其父实体版本协调多个子实体时,这是一种非常有用的机制。
    我在此答案中提供的链接中有很多示例,请花点时间阅读所有内容,您将更详细地了解所有这些概念。

    07-24 20:28