MySQLServer5.5でこれを試しました。
1)トランザクション分離レベルがrepeatable_readであることを確認しました
2)shell-1を開始し、その中でトランザクションを開始してから、selectを使用して値を読み取ります
3)shell-2を開始し、その中でトランザクションを開始してから、selectを使用して同じ値を読み取ります
4)shell-1で、値を値+ 1に更新し、コミットしました
5)shell-2で、値を値+ 1に更新し、コミットしました
値は更新の1つを失い、1だけ増加しました。
さて、私が理解しているように、RRは共有読み取りロックと排他的書き込みロックを使用します。つまり、上記の#4と#5では、トランザクションはデッドロックされているはずですが、それは起こりませんでした。
したがって、RRについての私の理解に誤りがあるか、MySQLが別の方法でRRを実装しています。それで、それは何ですか?
編集:同様の実験を通じて、RRトランザクション(t1)は、t2がコミットした後、t1がコミットする前であっても、そのテーブルで別の選択を行った場合、別のRRトランザクション(t2)によって同じテーブルに挿入された行を認識しないことも確認しました。(この実験へのリンクは次のとおりです:http ://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II --- Transaction-Isolation-Levels.htm )
MySQLのRRがファントム読み取りも処理するということですか?