java - 如何在 postgres - Hibernate 中设置锁定超时

标签 java postgresql hibernate jpa

我正在尝试设置 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/

相关文章:

java - Spring bean 被销毁,但 quartz 执行清理并需要 dataSource 进行连接并抛出异常

python - 如何找到 pg_config 路径

java - 检查外部长期 jar 是否成功启动的优雅方法

java - izpack 安装程序未实例化

python - Django 在单个查询集中组合外键

java - 如何将 SQL 查询转换为 HQL

java - 在应用程序中使用两个 hibernate.cfg.xml 文件

java - 如何在 hibernate 中将枚举序号映射到它的值?

java - 在Android中播放指定时间的音频

mysql - 使用 doctrine 2 在 Postgres 中选择模式配置