1

根据 JPA 2.1 规范...

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

我假设一个悲观锁总是会触发SELECT ... FOR UPDATE数据库上的 SQL,无论使用什么锁模式。现在有三个问题:

  1. 如果正确,假设是正确的还是这条规则有例外?
  2. 给定一个SELECT ... FOR UPDATE锁定的行。锁定的行不能被任何其他事务更新,除了锁定它的事务?
  3. 可以通过对事务执行提交或回滚来释放锁。如果应用程序(以及锁定行的事务)突然终止而没有对事务执行提交或回滚,锁会发生什么情况?
4

1 回答 1

3

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

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

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

还要回答问题3:

  1. 是的 - 在提交或回滚的情况下释放锁。但是,当发生错误、连接断开或事务处理时间过长时,回滚也会自动发生。因此,当应用程序终止时,会立即触发回滚。如果不是,它会在超时(通常是 5 分钟)后回滚。
于 2016-01-06T09:49:28.627 回答