回答編集履歴

1 修正

SVC34

SVC34 score 1110

2017/08/19 01:18  投稿

私の考えも、トランザクション分離レベルによる、です。
ただし私は、Repeatable Read以下のファントムリードが生じる分離レベルであれば、①に②がINSERTしCOMMITした結果は含まれうると考えます。ファントムリードが発生するということはレンジロックがとられないので②は①の実行中にロック待ちせず実行可能であり(読み取りロック方式 & ページロックでの衝突や、読み取りロック & ロックエスカレーションが発生しない限り)、またその結果が①の実行中に現れることに関してRepeatable Readの定義の上で禁止もしていないはずだからです。
ただし私は、Repeatable Read以下のファントムリードが生じる分離レベル(MySQLではRead Committed以下)であれば、①に②がINSERTしCOMMITした結果は含まれうると考えます。ファントムリードが発生するということはレンジロックがとられないので②は①の実行中にロック待ちせず実行可能であり(読み取りロック方式 & ページロックでの衝突や、読み取りロック & ロックエスカレーションが発生しない限り)、またその結果が①の実行中に現れることに関してRepeatable Readの定義の上で禁止もしていないはずだからです。
試しにDB2でCURSORを進めながら横からINSERTしてみましたが、INSERTされた行もSELECTされることを確認しました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る