teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2017/08/18 16:18

投稿

SVC34
SVC34

スコア1149

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