java – 如何在postgres中设置锁定超时 – Hibernate
发布时间:2020-12-15 03:03:05 所属栏目:Java 来源:网络整理
导读:我正在尝试为我正在处理的行设置一个 Lock ,直到下一次提交: entityManager.createQuery("SELECT value from Table where id=:id") .setParameter("id","123") .setLockMode(LockModeType.PESSIMISTIC_WRITE) .setHint("javax.persistence.lock.timeout",10
我正在尝试为我正在处理的行设置一个
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秒然后抛出 但是,无论超时设置如何,线程都会挂起,直到另一个线程完成. 看看这个例子: 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(); }); 我预计在第二个请求中,事务将等到超时设置然后抛出 Hibernate以这种方式向db生成我的请求: SELECT value from Table where id=123 FOR UPDATE 在这个answer中,我看到Postgres只允许SELECT FOR UPDATE NO WAIT将超时设置为0,但是不可能以这种方式设置超时. 有什么其他方法可以用于Hibernate / JPA吗? 解决方法
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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |