是否可以将db表与事务中的读取操作隔离?

时间:2015-08-05 10:49:57

标签: java mysql database hibernate transactions

我正在编写Java应用程序(Spring Data / Hibernate / JPA),它应该与MySQL DB一起使用。 我有一个简单的任务,应该是原子的: 1.从数据库中检索第一个项目 2.将此项目绑定到当前用户(UPDATE项目SET user_id = current_user_id WHERE id = id)

我在这两个步骤之间暂停了500毫秒,以针对并发性进行测试并在事务中运行它。事务存在,如果我在此代码中抛出异常,至少会回滚。 但是原子性并不像我想要的那样工作,在这500ms停顿的时候,我得到以下情况:

  1. user1 启动交易
  2. user1 检索第一项 - item1
  3. user2 启动交易
  4. user2 检索第一项 - item1
  5. user1 更新 item1
  6. user1 提交交易
  7. user2 更新 item1
  8. user2 提交交易
  9. 当user1处于事务中时,有没有办法将表与user2的读/写查询隔离?它应该是DB级事务,以允许在不同服务器上的应用程序的2个实例。

2 个答案:

答案 0 :(得分:1)

你要么使用SELECT FOR UPDATE来锁定它,要么在hibernate级别上引入版本(阅读乐观锁here)。

答案 1 :(得分:1)

您需要使用Hibernates Pessimistic锁定锁定您正在获取的行,直到事务完成。 请参阅以下链接。

https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html

您可以使用 LockMode.UPGRADE ,如果他尝试更新数据,则会限制user2。