【问题标题】:InnoDB / MySQL - new transaction uses old data on SELECT instead of returning updated dataInnoDB / MySQL - 新事务使用 SELECT 上的旧数据而不是返回更新的数据
【发布时间】:2014-02-06 20:35:34
【问题描述】:
  1. 开始交易 Tx1
  2. Tx1 执行SELECT
  3. 提交 Tx1
  4. 使用不同的连接在不同的会话中开始事务 Tx2
  5. Tx2 执行SELECT
  6. 更新 Tx2 中的行
  7. 提交 Tx2
  8. 开始新的交易,Tx1
  9. 执行选择 - 从第 2 步获取结果(??)
  10. 提交 Tx1
  11. 开始交易 Tx1
  12. 执行选择 - 获得正确的结果,即从 Tx2 提交的更新

很困惑……怎么会这样?它可靠且持续地发生。

【问题讨论】:

  • 如果 8 在 7 完成之前开始,并且您使用的隔离级别高于 READ UNCOMITTED,则可能会发生这种情况。
  • 事实并非如此 :( 7 肯定在 8 之前发生

标签: mysql sql jdbc transactions innodb


【解决方案1】:

如果事务隔离级别设置为REPEATABLE READ,就会发生这种情况。将事务隔离级别设置为READ COMMITTED,一切都很好。并没有真正解释为什么(一定是某种 BEGIN TRANSACTION 闲逛?)

【讨论】:

  • 如果这是真的,那将是一个错误。此外,BEGIN TRANSACTION 会自动提交之前的任何事务。
  • @MarcusAdams 在 JDBC 中,事务启动由驱动程序处理,而不是由开发人员显式执行 BEGIN TRANSACTION
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多