mysql - 从 JPA PESSIMISTIC 锁获取的数据库行的物理锁

标签 mysql postgresql jpa concurrency pessimistic-locking

根据 JPA 2.1 规范...

The lock modes PESSIMISTIC_READ, PESSIMISTIC_WRITE, and PESSIMISTIC_FORCE_INCREMENT are used to immediately obtain long-term database locks.

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

  1. 该假设是否正确?如果正确,是否存在与此规则不同的异常(exception)情况?
  2. 给定一个 SELECT ... FOR UPDATE 锁定行。除了锁定它的事务之外,任何其他事务都不能更新锁定的行?
  3. 可以通过对事务执行提交或回滚来释放锁。如果应用程序(以及锁定行的事务)在没有对事务进行提交或回滚的情况下突然终止,锁会发生什么情况?

最佳答案

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

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

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

同时回答问题 3:

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

关于mysql - 从 JPA PESSIMISTIC 锁获取的数据库行的物理锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620484/

相关文章:

php - 对 PHP 脚本的更改不会执行

mysql - mysql全文搜索中给定查询字符串的不同组合的精确单词匹配

sql - 使用窗口函数确定 PostgreSQL 中的 30 天运行计数

java - 在 Play Framework 2.0.1 中访问 scala 模板内子实体的属性时出现问题

与 mysql 服务器连接的 php 文件无法正常工作

php - 尝试通过 Laravel 中的相关表获取数据

php - 带有 PDO 准备语句的 postgresql to_tsquery()

postgresql - 按名称删除 jsonb 数组项

java - 如何持久化 JPA map @OneToMany

java - 使用不同的持久性单元进行测试