【问题标题】:MySQL dirty reads vs dirty reads defined in SQL standardMySQL 脏读与 SQL 标准中定义的脏读
【发布时间】:2019-06-16 04:51:17
【问题描述】:

来自 MySQL 手册:

阅读未提交

SELECT 语句以非锁定方式执行,但可能会使用行的早期版本。因此,使用这个隔离级别,这样的读取是不一致的。 这也称为脏读。否则,此隔离级别的工作方式类似于 READ COMMITTED。

粗体部分让我感到困惑。 “可能会使用早期版本的行”?用在什么地方?这怎么能称为“脏读”?

SQL 标准说脏读包含从未存在的数据:

P1(“脏读”):SQL 事务 T1 修改一行。 SQL 事务 T2 然后在 T1 执行 COMMIT 之前读取该行。如果 T1 然后执行 ROLLBACK,则 T2 将读取从未提交的行,因此可能被认为从未存在。

这里是 MySQL 手册错误还是什么?

【问题讨论】:

  • 你改了字! 可能被认为从未存在过 != 从未存在过

标签: mysql read-uncommitted dirtyread


【解决方案1】:

MySQL 的定义是脏读的一种情况:行已经存在(但正在被 T1 更新)并且 T2 读取它的情况。然后如果 T1 回滚,T2 可能用它执行了错误的计算。丑。

SQL 定义涵盖更多情况。例如,当 T1 第一次创建行(但尚未提交),然后被 T2 读取。在这种情况下,如果事务 T1 回滚,就好像该行从未存在过......但 T2 已经在使用它,谁知道它的用途。丑。

总之,这两种情况都很丑陋,并且可能导致不一致。 SQL 定义比 MySQL 更全面。

【讨论】:

  • 你提供的后一种情况在MySQL中不是也可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2019-08-24
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多