当前位置: 首页 > 知识库问答 >
问题:

从JPA悲观锁获得的DB行的物理锁

韩鸿
2023-03-14

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

我假设悲观的锁总是会触发数据库上的select...FOR updateSQL,不管使用什么锁模式。现在有三个问题:

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

共有1个答案

鲍钊
2023-03-14

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

>

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

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

  •  类似资料:
    • 我试图在JPA中通过Hibernate3对Postgres数据库使用悲观锁定。我无法使锁超时--它似乎永远挂着。 这里有一个例子: 按照我的理解,em2应该尝试最多5秒(5000ms)来获得锁,然后应该抛出一个异常。相反,代码变成死锁。 谢谢,阿拉斯泰尔

    • 我正在使用Spring Boot、JPA、Oracle 12C和下面的类型化查询来选择要处理的“新”项目。一旦我选择了“新”项目,我就会更新其状态,使其不再符合选择条件,但我看到一个并发问题,相同的项目被选中。 我在这里读到,我需要设置一个'LockModeType.PESSIMISTIC_WRITE'的查询,以防止其他线程选择相同的行,但它似乎不起作用。 我是否遗漏了下面的内容,或者我是否需要另

    • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html

    • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

    • 我上面代码的日志是: 数据库也会更新。为什么lock()不工作?不是在lock()之后其他实例无法更新吗?还是别的什么?还是我错过了什么?

    • 本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自