①select ✳︎ from table名:
で全てのデータを取得中に
②insert into table(a,b,c)values(1,2,3):
で新たなデータが登録された場合
①で取得したデータには②で登録したデータが含まれるのでしょうか?
根本的に勘違いしている可能性があるので、間違っている箇所がありましたらご指摘よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
私の考えも、トランザクション分離レベルによる、です。
ただし私は、Repeatable Read以下のファントムリードが生じる分離レベル(MySQLではRead Committed以下)であれば、①に②がINSERTしCOMMITした結果は含まれうると考えます。ファントムリードが発生するということはレンジロックがとられないので②は①の実行中にロック待ちせず実行可能であり(読み取りロック方式 & ページロックでの衝突や、読み取りロック & ロックエスカレーションが発生しない限り)、またその結果が①の実行中に現れることに関してRepeatable Readの定義の上で禁止もしていないはずだからです。
試しにDB2でCURSORを進めながら横からINSERTしてみましたが、INSERTされた行もSELECTされることを確認しました。
投稿2017/08/18 16:07
編集2017/08/18 16:18総合スコア1149
0
修正(断言的な記述を修正)
トランザクション分離レベルの設定次第です。
採用されているトランザクション分離レベルの多くはREAD COMMITTEDだと思うので、
その場合には、①を開始以降に②が行われても、①の結果には(ほぼ※)含まれません。
※含まれていたとしても、selectの結果行が増えるのと同じ結果になるなら特段の処理は不要だと思います。
但し、実際の環境についてどのトランザクション分離レベルを採用しているかの確認を取られた方が確実です。
投稿2017/08/17 14:23
編集2017/08/18 16:39総合スコア25195
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/18 11:30 編集
2017/08/18 11:53 編集
2017/08/18 16:49 編集
2017/08/19 03:27
2017/08/19 05:45 編集
2017/08/19 07:01 編集
2017/08/19 08:28
2017/08/21 01:11 編集
2017/08/21 01:08 編集
2017/08/21 01:33
2017/08/21 01:35 編集
2017/08/21 01:42 編集
0
DB製品によってロックの仕組みは異なるのですが、①のアクセス中にテーブルには読み取りロックがかかります。読み取りロックがかかったオブジェクトに対して別セッションは書き込みアクセスをできないため、②は①が終わるまで待たされることになります。
投稿2017/08/17 14:15
総合スコア5568
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/18 11:25 編集
2017/08/18 11:33 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/18 16:33
2017/08/18 16:40
2017/08/21 04:28 編集
2017/08/21 07:09 編集
2017/08/21 08:04
2017/08/21 09:31