作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试设置 Lock
对于我正在处理的行,直到下一次提交:
entityManager.createQuery("SELECT value from Table where id=:id")
.setParameter("id", "123")
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.setHint("javax.persistence.lock.timeout", 10000)
.getSingleResult();
我认为应该发生的是,如果两个线程同时尝试写入数据库,一个线程将先于另一个线程到达更新操作,第二个线程应该等待 10 秒然后抛出 PessimisticLockException
.
但是不管超时设置如何,线程都会挂起直到另一个线程完成。
看这个例子:
database.createTransaction(transaction -> {
// Execute the first request to the db, and lock the table
requestAndLock(transaction);
// open another transaction, and execute the second request in
// a different transaction
database.createTransaction(secondTransaction -> {
requestAndLock(secondTransaction);
});
transaction.commit();
});
我预计在第二个请求中事务会等到超时设置然后抛出 PessimisticLockException
, 但它会永远死锁。
Hibernate 以这种方式生成我对数据库的请求:
SELECT value from Table where id=123 FOR UPDATE
在此answer我看到 Postgres
只允许将超时设置为 0 的 SELECT FOR UPDATE NO WAIT
,但不可能以这种方式设置超时。
Hibernate/JPA
还有其他方法可以使用吗?也许this way以某种方式推荐?
最佳答案
Hibernate 支持 bunch of query hints .您正在使用的设置查询超时,而不是悲观锁。查询和锁是相互独立的,需要使用如下所示的hint。
但在你这样做之前,请注意,Hibernate 本身并不处理超时。它只将它发送到数据库,它取决于数据库是否应用它以及如何应用它。
要为悲观锁设置超时,您需要使用 javax.persistence.lock.timeout
提示。这是一个例子:
entityManager.createQuery("SELECT value from Table where id=:id")
.setParameter("id", "123")
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.setHint("javax.persistence.lock.timeout", 10000)
.getSingleResult();
关于java - 如何在 postgres - Hibernate 中设置锁定超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51845853/
我是一名优秀的程序员,十分优秀!