微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

解决方法

Hibernate支持 bunch of query hints.你正在使用的那个设置查询的超时,而不是悲观锁.查询和锁彼此独立,您需要使用下面显示提示.

但是在你这样做之前,请注意,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();

原文地址:https://www.jb51.cc/java/128631.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐