如何在 postgres 中设置锁定超时 - 休眠
2022-09-04 02:57:39
我正在尝试为我正在处理的行设置一个 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秒,然后抛出悲观LockException
。
但相反,线程会挂起,直到另一个线程完成,而不管超时集如何。
看看这个例子:
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();
});
我预计在第二个请求中,事务将等到超时集,然后抛出悲观锁例外
,但它永远处于死锁状态。
休眠以这种方式生成我对数据库的请求:
SELECT value from Table where id=123 FOR UPDATE
在这个答案中,我看到只允许将超时设置为0,但不可能以这种方式设置超时。Postgres
SELECT FOR UPDATE NO WAIT
有没有其他方法可以与 ?也许这种方式以某种方式被推荐?Hibernate / JPA