【问题标题】:Is it possible to isolate db table from read operations in transaction?是否可以将数据库表与事务中的读取操作隔离开来?
【发布时间】:2015-10-28 02:29:31
【问题描述】:

我正在编写 Java 应用程序(Spring Data/Hibernate/JPA),它应该适用于 MySQL DB。 我有一个简单的任务,应该是原子的: 1. 从数据库中检索第一项 2. 将此item绑定到当前用户(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 个实例。

【问题讨论】:

    标签: java mysql database hibernate transactions


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多