Грязное чтение MySQL против грязного чтения, определенного в стандарте SQL
Из руководства MySQL:
ЧИТАТЬ БЕЗ КОММИТЕТЫ
Операторы SELECT выполняются без блокировки, но может использоваться более ранняя версия строки. Таким образом, используя этот уровень изоляции, такие чтения не согласованы. Это также называется грязным чтением. В противном случае этот уровень изоляции работает как READ COMMITTED.
Жирная часть сбивает меня с толку. "Может быть использована более ранняя версия строки"? Используется где? И как это можно назвать "грязным чтением"?
Стандарт SQL гласит, что грязное чтение содержит данные, которых никогда не было:
P1 ("грязное чтение"): SQL-транзакция T1 изменяет строку. SQL-транзакция T2 затем читает эту строку, прежде чем T1 выполнит COMMIT. Если T1 затем выполняет ROLLBACK, T2 прочитает строку, которая никогда не была зафиксирована и которая, таким образом, может считаться никогда не существующей.
Руководство MySQL здесь не так или как?
1 ответ
Определение MySQL - это один случай грязного чтения: случай, когда строка уже существует (но обновляется T1) и T2 читает ее. Затем, если T1 откатывается, T2, возможно, выполнил неправильные вычисления с ним. Некрасиво.
Определение SQL охватывает больше случаев. Например, когда строки впервые создаются T1 (но еще не зафиксированы), а затем читаются T2. В этом случае, если транзакция T1 откатывается, это как если бы строка никогда не существовала... но T2 уже использует ее для того, кто знает, для каких целей. Некрасиво.
В итоге оба случая ужасны и могут привести к несоответствиям. Определение SQL является более полным, чем определение MySQL.