从MySQL手册:
读未提交
SELECT语句以非锁定方式执行,但是可能会使用行的早期版本。因此,使用此隔离级别,此类读取不一致。这也称为脏读。否则,此隔离级别的工作方式类似于READ COMMITTED。
粗体部分使我感到困惑。 “可能使用行的早期版本”?用在哪里?怎样将其称为“脏读”?
SQL标准说脏读包含从未存在的数据:
P1(“脏读”):SQL事务T1修改一行。然后,SQL事务T2在T1执行COMMIT之前读取该行。如果T1然后执行ROLLBACK,则T2将读取从未提交的行,因此可以认为该行不存在。
MySQL手册在这里还是错了?
最佳答案
MySQL定义是脏读的一种情况:行已存在(但正在由T1更新)并且T2读取该行的情况。然后,如果T1回滚,则T2可能执行了错误的计算。丑陋。
SQL定义涵盖更多情况。例如,当行由T1首次创建(但尚未提交),然后由T2读取时。在这种情况下,如果事务T1被回滚,就好像该行从不存在。丑陋。
总之,这两种情况都很丑陋,并且可能导致不一致。 SQL定义比MySQL更为全面。
关于mysql - MySQL脏读与SQL标准中定义的脏读,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54312994/