我在这里分享一个关于MySQL的可重复介绍,非常好,可以解决一些疑惑。链接如下所示。
SQL 1992标准中幻影的解释;
“事务T1根据一些查询条件读取一些数据行,然后事务T2执行SQL语句来插入一行或多行符合查询条件的数据。此时,如果事务T1重复与第一个查询相同的操作,它将获得不同的数据行。”
魔法读取比不可重复读取更重要,强调两次查询得到的行数不同(或多或少),或者行数相同但不是同一个批次(被替换)。
这是英文原版:
P3(“幻影”): SQL-事务T1读取第N行的集合
满足某些搜索条件。然后是T2事务
执行生成一行或多行的SQL语句
满足SQL-事务T1使用的搜索条件。如果
然后,事务T1用相同的
搜索条件,它获得不同的行集合。
而且,从定义上来说,SQL标准的可重复阅读并不能解决错觉阅读问题。
但是MySQL的可重复读取的标准比SQL的高。具体来说,当仅使用select语句时,不会发生幻像读取(这种情况简称为幻像读取),但当发生与写入相关的操作时,会发生幻像读取(这种情况简称为幻像写入)。
例如,一个事务在被选择两次时可以获得相同的行数和相同的值,并且没有错觉读取。但是,在更新或插入操作期间报告了一个错误,可以发现有额外的行不存在,就像一个幻觉。
你读的英语是幻影。幻读可以理解为幻读的一种情况,幻写则是另一种情况。根据定义,幻像读取和幻像写入都可以理解为幻像读取。
所以这就解释了为什么有些文章会说MySQL的可重复阅读可以防止一些错觉阅读的情况。
另外,从面试的角度来看,如果不强调MySQL,可以忽略,只需按照SQL中错觉阅读和可重复阅读的定义来回答即可。如果面试官问MySQL的特殊情况,可以根据MySQL本身的运行机制和自己的实践经验来回答。
参考:
MySQL的可重复介绍:
https://blog . pytian.com/understanding-MySQL-隔离-级别-可重复-已读
以下是1992年SQL标准中对Phantom的原始描述。网页加载较慢,网页加载后会全文搜索关键词“幻影”:
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt