9

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がファントム読み取りも処理するということですか?

4

1 に答える 1

8

MySQLはRepeatableReadに実際には準拠していません。シリアル化可能な分離レベルを使用するか、選択の後にFOR UPDATEを配置することで、強制的に実行できます(以下の例を参照)。その後、目的の動作が実現されます。ファントム読み取りに関しては、MySQLは実際には必要以上に厳格です...

SELECT value FROM table WHERE id = 7 FOR UPDATE;
于 2012-05-03T09:11:46.523 に答える