Я попробовал это с MySQL Server 5.5:
1)убедился, что уровень изоляции транзакций повторяем_read
2)запустил шелл-1, запустил в нем транзакцию, затем прочитал значение через select
3)запустил шелл-2, запустил в нем транзакцию, затем прочитать одно и то же значение через select
4)в оболочке -1, обновить значение до значения + 1 и зафиксировать
5)в оболочке -2, обновить значение до значения + 1 и commit
Значение потеряло одно из своих обновлений и увеличилось только на 1.
Теперь, насколько я понимаю, RR использует разделяемые блокировки чтения и монопольные блокировки записи, что означает, что в #4 и #5 выше, транзакции должны d заперли насмерть-, но этого не произошло.
Таким образом, либо мое понимание RR ошибочно, либо MySQL реализует RR по-другому. Так что же это?
РЕДАКТИРОВАТЬ:посредством аналогичного эксперимента, также подтвердил, что транзакция RR (t1)не видит строки, вставленные в ту же таблицу другой транзакцией RR (t2), если она выполняет другую выберите в этой таблице даже после фиксации t2 и до фиксации t1. (Вот ссылка на этот эксперимент:http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm)
Означает ли это, что MySQL RR также заботится о фантомном чтении?