0

来自 MySQL 手册:

阅读未提交

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

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

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

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

MySQL手册在这里是错的还是什么?

4

1 回答 1

1

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

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

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

于 2019-01-22T17:06:07.023 回答