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

JPA悲观_读取在指定的时间段内没有超时

华永新
2023-03-14

我在我的项目中使用了Spring Boot,Spring Data,JPA(Hibernate)和MySQL。这是我的存储库界面中的方法签名:

@Lock(LockModeType.PESSIMISTIC_READ)
@QueryHints({ @QueryHint(name = "javax.persistence.lock.timeout", value = "5000") })
@Query("select b from book b where b.id = :bookId")
Optional<Book> findBookCustom(Long bookId);

当我检查SQLhtml" target="_blank">日志时,我可以看到“for共享”子句被附加到选择语句中。

这是MySQL文档中关于共享锁的一段引文:

如果这些行中的任何一行被尚未提交的另一个事务更改,您的查询将等待该事务结束,然后使用最新值。

我实际上可以通过从另一个线程更新该书来触发阻塞行为。当我暂停更新线程(书籍更新后),然后启动阅读线程时,我可以看到阅读线程被阻塞。问题是,读取线程等待大约50秒(我想这是默认的等待值),直到抛出超时异常。我在QueryHint中提供的值5000无效。我还尝试直接使用EntityManager发出JPQLselect语句,但结果是相同的。关于如何将超时设置为5秒,有什么想法吗?

共有2个答案

端木淇
2023-03-14

MySQL不支持查询锁超时,因此< code > @ query hints({ @ query hint(name = " javax . persistence . lock . time out ",value = "5000") })被忽略

有关详细信息:https://blog.mimacom.com/handling-pessimistic-locking-jpa-oracle-mysql-postgresql-derbi-h2/

仲鸿风
2023-03-14

我们可以通过工作台或cmd-line检查您的MySQL设置吗:

select @@innodb_lock_wait_timeout

然后尝试通过以下方式将其设置为新值:

set session innodb_lock_wait_timeout = 5

现在可以通过JPA查询获取悲观锁,它将LockTimeout设置为5秒。有关更多信息,请查看MySQL文档。

根据所使用的持久性提供程序和数据库,可能会也可能不会看到提示。

希望这有所帮助。干杯!

更新

如果不想修改MySQL环境中的会话。可以在应用程序属性文件中设置以下设置:

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

  • 问题内容: 我正在尝试在JPA中使用悲观锁定,而不是针对Postgres数据库使用Hibernate 3。我无法超时锁定-它似乎永远挂着。 这是一个例子: 据我了解,em2应该尝试长达五秒钟(5000毫秒)来获取锁,然后应该抛出异常。而是代码陷入僵局。 如果我在两个不同的线程中运行它,那么我会看到线程2(带有em2)在线程1(em1)释放它后立即获得了锁。因此锁定正在发生,只是永不超时。 我用PE

  • 我没有成功地将Spring数据发送给postgres a以进行NoWait更新。 我已经在存储库中尝试过了: 配置(代码段) 我甚至将EntityManager注入到服务中,结果返回0: info(em.getproperties().get(“javax.persistence.lock.timeout”)); 但是上面只给了我“用于更新”,没有设置NOWAIT部分。我设置的事情是正确的(从另一

  • 我的用例——我是一名医生。在某一天,我可以工作几个小时,但有些时间不可用。我想创建一个对象“周期我的工作日”。当有人预约上午8点到9点(即“周期病人1预约”)时,该时段将从我的工作日“删除”。当新患者访问myWorkDay时,他只看到myWorkDay-病人1约会。如果病人1释放了他的时隙,那么新患者会看到完整的myWorkDay。 有可能使用JodaTime做到这一点吗? 有一个额外的要求是不必

  • Hibernate是我的JPA实现。

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