MySQL脏读与SQL标准中定义的脏读

时间:2019-01-22 16:55:32

标签: mysql read-uncommitted dirtyread

摘自MySQL手册:

  

读未提交

     

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

加粗的部分使我感到困惑。 “可能使用行的早期版本”?用在哪里?以及如何将其称为“脏读”?

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

  

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

MySQL手册在这里还是错误的?

1 个答案:

答案 0 :(得分:1)

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

SQL定义涵盖更多情况。例如,当第一次由T1创建行 时(但尚未提交),然后由T2读取。在这种情况下,如果事务T1被回滚,就好像该行不存在了。。。。但是T2已经将它用于知道目的的人。丑。

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