Java设置超时锁_java – 如何在postgres中设置锁定超时 – Hibernate

我正在尝试为我正在处理的行设置一个

Lock,直到下一次提交:

entityManager.createQuery("SELECT value from Table where id=:id")

.setParameter("id","123")

.setLockMode(LockModeType.PESSIMISTIC_WRITE)

.setHint("javax.persistence.lock.timeout",10000)

.getSingleResult();

我认为应该发生的是,如果两个线程同时尝试写入db,一个线程将在另一个线程之前到达更新操作,第二个线程应等待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以这种方式向db生成我的请求:

SELECT value from Table where id=123 FOR UPDATE

在这个answer中,我看到Postgres只允许SELECT FOR UPDATE NO WAIT将超时设置为0,但是不可能以这种方式设置超时.

有什么其他方法可以用于Hibernate / JPA吗?

也许推荐this way?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值