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

使用 hiberante session.load 锁定对象

秦联
2023-03-14

Hibernate有悲观锁定机制,可以用来锁定数据库行。

session.lock(Object对象,LockMode锁模式)。

假设我锁定了一个对象:

1)session.lock(myObject.LockMODE.READ)
2)session.lock(myObject,LockMODE.UPGRADE)
3)session.lock(myObject.LockMODE.UPGRADE_NOWAIT)

>

  • 如果其他线程也发出上述语句 1,会发生什么?该线程会简单地阻塞吗?还是会得到某种异常?像 CannotAcquireLock 异常这样的东西?我想了解 1,2,3 的行为。
  • 如果线程获取了锁然后死亡会发生什么?锁会自动释放吗?还是记录永远锁定?

      session.lock(myObject,LOCKMODE.SOME_LOCK_MODE)
      //thread dies . (lets say JVM is killed)
    
  • 共有1个答案

    韩弘方
    2023-03-14

    锁被绑定到事务。一旦事务被提交或回滚,它就会被释放。如果您的线程死亡,并保持您的事务悬而未决,锁仍然持有。

    其他尝试获取锁的线程将只是等待。

    如果我没记错的话,对 lock() 的调用会导致选择 ...用于更新 SQL 语句。

     类似资料:
    • 问题内容: 我有一些Java代码可以获取并设置会话属性: 为了使该代码具有线程安全性,我想将其包装在一个同步块中。但是我该怎么用做锁定对象呢?使用会话是否有意义? 问题答案: 使用您无法控制的锁通常会让人皱眉。锁的作用域应尽可能紧密,并且由于会话或多或少是全局对象,因此不适合使用。尝试使用与java.util.concurrent.locks包不同的锁,并将其范围限定到您的类。

    • 问题内容: 输出是 线程1开始 线程1的内部演示 线程2开始 线程2的内部演示 由于,执行尚未结束。 我已经通过类的同一个实例来的两个类的构造函数和。 对in 的调用位于一个块中。 要在通话中是 没有 的块。 所以,当被执行时,由于块,的监视器应锁定,导致拒绝访问,以由所述。 但是,这没有发生。 预期的输出是 (输出在完成之前。) 因此,我的基本问题是: 即使 尚未完成 块, 如何成功执行? 问题

    • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract

    • 问题内容: 我希望以下测试仅打印“已被锁定”一次。但是它因此会打印行。 据我了解,将在可能的情况下将其锁定(即,如果尚未锁定)。但是显然不是这样。 如何设置这样的锁线程安全? 问题答案: 名称为,表示您已经拥有锁了。 如果希望使用线程块,则可以使用例如具有1(或更多)许可的a。

    • 我的iOS应用程序在收到推送通知时出现了一个奇怪的情况。UI保持锁定,什么都不起作用。当我暂停调试器时,我会在我的线程中看到 。 对代码进行解译,我可以看到它与两件事有关: 方法(因为当我删除它时,问题就消失了)/li> 我收到一个推送通知,如下所示 我用Xcode做了一个新的简单的项目来证明我所说的。我使用前一个bundle标识符来接收相同的推送。按照AppDelegate中显示问题的代码操作:

    • 问题内容: 我们的一位客户正在使用某些Novell安全软件,有时会锁定我们的软件创建的某些.class文件。发生这种情况时,这会给他们带来一些麻烦的问题,我正在尝试研究一种变通办法,我们可以将其添加到错误处理中以解决此问题。我想知道java api中是否有任何调用可用于检测文件是否已锁定,如果已锁定,则将其解锁。 问题答案: 在尝试写入文件之前,您可以使用File.canWrite()检查Java