質問: 1select ✳︎ from table名: で全てのデータを取得中に 2insert into table(a,b,c)values(1,2,3): で新たなデータが登録された場合 1で取得したデータには2で登録したデータが含まれるのでしょうか? 根本的に勘違いしている可能性があるので、間違っている箇所がありましたらご指摘よろしくお願いします。
回答: 私の考えも、トランザクション分離レベルによる、です。 ただし私は、Repeatable Read以下のファントムリードが生じる分離レベル(MySQLではRead Committed以下)であれば、1に2がINSERTしCOMMITした結果は含まれうると考えます。ファントムリードが発生するということはレンジロックがとられないので2は1の実行中にロック待ちせず実行可能であり(読み取りロック方式 & ページロックでの衝突や、読み取りロック & ロックエスカレーションが発生しない限り)、またその結果が1の実行中に現れることに関してRepeatable Readの定義の上で禁止もしていないはずだからです。 試しにDB2でCURSORを進めながら横からINSERTしてみましたが、INSERTされた行もSELECTされることを確認しました。