Повторяемое чтение MySQL и потерянное обновление/фантомное чтение

Я попробовал это с 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 также заботится о фантомном чтении?

9
задан shrini1000 6 April 2012 в 08:17
поделиться