gpt4 book ai didi

java - Hibernate JPA - PESSIMISTIC.WRITE 不起作用

转载 作者:行者123 更新时间:2023-11-29 13:33:03 26 4
gpt4 key购买 nike

我正在使用 JPA 2.0 的 Hibernate 实现在表行中创建一个计数器。我正在使用 MySQL 5.5 和 InnoDB 引擎。我试图锁定计数器行,以便 JVM 外部的任何进程都无法查看该计数器,直到我的代码将其递增。我的代码如下所示:

  //inside a Transaction....

//key is an enum
final PropertyKey key = PropertyKey.DEPLOY_COUNTER;
final Query query =
entityManager.createQuery("FROM Property s where propertyKey = :key").setParameter("key", key);
query.setLockMode(LockModeType.PESSIMISTIC_WRITE);
LOG.debug("Blocking (maybe) while waiting to update deploy counter");
final Property counterAsProperty = (Property) query.getSingleResult();

try
{
Thread.sleep(15000);
//while sleeping I use MySQL cli to check value of property in database
}
catch (InterruptedException e)
{
e.printStackTrace();
}

//in java, increment counter by one and then save in db
//...

我使用 Thread.sleep() 在事务中间暂停代码。当线程 hibernate 时,我使用 MySQL CLI 客户端登录数据库并检查属性的值。该 session 看起来像这样:

user@mypc [user]> begin work;
Query OK, 0 rows affected (0.00 sec)

user@mypc [user]> select * from property where property_key = 'DEPLOY_COUNTER';
+----+---------+-----------+--------------------+----------------+
| id | version | encrypted | property_key | property_value |
+----+---------+-----------+--------------------+----------------+
| 10 | 0 | 0 | DEPLOY_COUNTER | 66 |
+----+---------+-----------+--------------------+----------------+

注意查询如何立即返回(0.00 秒),而我预计它会阻塞,直到线程退出 hibernate 并且事务完成。我对 LockModeType.PESSIMISTIC_WRITE 的理解是,它应该将检索到的行放入排他锁中,其他事务无法读取或写入。

注意:在线程 hibernate 时对此行的更新会阻塞。

如果我设置了 PESSIMISTIC_WRITE 锁定模式,为什么另一个数据库连接可以在另一个事务正在运行时查看数据?

最佳答案

默认的InnoDB隔离级别是REPEATABLE READ,它允许没有排它锁的事务读取(但不能更新)锁定的记录。这允许其他事务对记录进行非脏读取。 SERIALIZABLE 似乎可以防止对锁定记录进行任何读取。您可以在设置 hibernate 连接属性时设置隔离级别 hibernate.connection.isolation ,虽然这会影响到所有的连接,但不是我愿意付出的代价。这篇 SO 文章指出了一种针对每个连接执行此操作的方法,但该方法需要已弃用的方法:JPA and MySQL transaction isolation level

我最终使用了其中之一

UPDATE counter SET value = LAST_INSERT_ID(value + 1);
SELECT LAST_INSERT_ID();

此处引用的方法:http://tedyoung.me/2011/04/14/jpa-counters-and-sequences/ ,不需要任何锁定。

关于java - Hibernate JPA - PESSIMISTIC.WRITE 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19147761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com