我正在编写 Java 应用程序(Spring Data/Hibernate/JPA),它应该可以与 MySQL DB 一起使用。 我有一个简单的任务,它应该是原子的: 1. 从数据库中检索第一项 2. 将此项绑定(bind)到当前用户(UPDATE item SET user_id=current_user_id WHERE id=id)
我在这两个步骤之间暂停了 500 毫秒,以针对并发测试它并在事务中运行它。事务存在,至少如果我在此代码中抛出异常它会回滚。 但是原子性并没有像我希望的那样工作,在这 500 毫秒的停顿中,我遇到了以下情况:
- user1开始交易
- user1 检索第一个项目 - item1
- user2开始交易
- user2 检索第一个项目 - item1
- user1 更新 item1
- user1 提交交易
- user2 更新 item1
- user2提交交易
有没有办法在用户 1 处于事务中时将表与用户 2 的读/写查询隔离开来?允许在不同服务器上运行应用程序的 2 个实例应该是数据库级事务。
最佳答案
您应该使用 SELECT FOR UPDATE
来锁定它或在 hibernate 级别引入版本(阅读关于乐观锁 here )。
关于java - 是否可以将数据库表与事务中的读取操作隔离开来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31830385/