从JPA PESSIMISTIC锁获取的DB行的物理锁定

时间:2016-01-05 20:17:40

标签: mysql postgresql jpa concurrency pessimistic-locking

根据JPA 2.1规范......

  

锁定模式PESSIMISTIC_READPESSIMISTIC_WRITE和   PESSIMISTIC_FORCE_INCREMENT用于立即获得长期   数据库锁。

我认为,无论使用什么锁模式,悲观锁都会在数据库上触发SELECT ... FOR UPDATE SQL。现在有三个问题:

  1. 假设是正确的,还是有这个规则的例外,如果正确的话?
  2. 鉴于SELECT ... FOR UPDATE已锁定行。除锁定它的事务外,任何其他事务都无法更新锁定的行吗?
  3. 可以通过对事务执行提交或回滚来释放锁。如果应用程序(以及锁定行的事务)突然终止而没有对事务进行提交或回滚,那么锁会发生什么?

1 个答案:

答案 0 :(得分:2)

对于问题1和2,您的假设是正确的:

  1. 是 - 悲观锁通常使用SELECT ... FOR UPDATE,因为大多数数据库和JPA实现仅支持这种类型的锁。在这种情况下,READ和WRITE块之间没有区别,只要两者都表现为WRITE锁,JPA规范就允许它。

  2. 是 - 任何其他交易都无法修改锁定的行。在WRITE锁定的情况下(大多数时间也用于READ锁定 - 请回答1),在释放锁定之前也无法读取锁定的行。请注意,同一个表中的其他未锁定行可以自由阅读和修改。

  3. 还要回答问题3:

    1. 是 - 在提交或回滚时释放锁。但是,当发生错误,连接断开或事务处理时间过长时,也会自动进行回滚。因此,当应用程序死亡时,立即触发回滚。如果没有,则在超时(通常为5分钟)后回滚。