java - 是否可以将数据库表与事务中的读取操作隔离开来?

标签 java mysql database hibernate transactions

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

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

  1. user1开始交易
  2. user1 检索第一个项目 - item1
  3. user2开始交易
  4. user2 检索第一个项目 - item1
  5. user1 更新 item1
  6. user1 提交交易
  7. user2 更新 item1
  8. user2提交交易

有没有办法在用户 1 处于事务中时将表与用户 2 的读/写查询隔离开来?允许在不同服务器上运行应用程序的 2 个实例应该是数据库级事务。

最佳答案

您应该使用 SELECT FOR UPDATE 来锁定它或在 hibernate 级别引入版本(阅读关于乐观锁 here )。

关于java - 是否可以将数据库表与事务中的读取操作隔离开来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31830385/

相关文章:

php mysql-上传具有相同id的文件

mysql - 在 haproxy 中写入故障转移期间,正在进行的 mysql 事务会发生什么情况?

database - 并发冲突 : the UpdateCommand affected 0 of the expected 1 records

java - 使用 swingworker 线程更新 UI

java - 如何使用 wsimport 生成@HandlerChain

java - Hibernate 3.2.0 Final 中的二级缓存

MySQL高效数据转联表查询

java - 使用 JSlider 更改图像亮度

mysql - Python3 mysqlclient-1.3.6 (aka PyMySQL) 用法?

java - 编译时无法启动 Activity ComponentInfo : android. database.sqlite.SQLiteException : no such table ,