- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DB2の共有ロックについて。)
DB2の共有ロックについて
このQ&Aのポイント
- DB2 Express-C 9.7を利用していますが、コマンドエディターを複数起動し、共有ロックの動きを確認したいと思っています。
- コマンドエディターAでSELECT文を発行し、コマンドエディターBでSELECT文を発行した場合、想定ではコマンドエディターBのSELECT文は結果が返却されず待ち状態になると考えていました。ところが待ち状態にならずに値が返却されました。
- コマンドエディターAの設定で自動コミットのチェックを外しても外さなくても同様です。また分離レベルは特に明示的に変更していないのでデフォルトのREAD_COMMITEDになっていると思います。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
DB2の排他制御は、そんなに詳しくないですが。。。 排他制御は、RDBMSにより、仕組み、細かな仕様に差がある部分です。それをいろいろなオプションを組み合わせることで、ほぼ同等、あるいは代替手段として使用できるように各RDBMSで段階的に実装しています。 SELECT同士であれば、一方が FOR UPDATE などで更新前提あるいは排他的なオプションを指定した検索をしなければ、共用(排他制御による待ちにはならない)できるのは当然の動きと思います。
お礼
お返事有難うございます。 少し試したところ、下記のようになりました。 SQL Serverを少し触ったことがあるのですが、同じような感じで結果自体に疑問はなかったのですが・・・。下記のURLのロックの互換性と同じだなと。 ttp://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html コマンド・エディター1:SELECT文発行 コマンド・エディター2:SELECT文発行 結果:どちらも値を返却。 コマンド・エディター1:SELECT FOR UPDATE文発行 コマンド・エディター2:SELECT文発行 結果:どちらも値を返却。 コマンド・エディター1:SELECT FOR UPDATE文発行 コマンド・エディター2:SELECT FOR UPDATE文発行 結果:どちらも値を返却。 コマンド・エディター1:SELECT FOR UPDATE文、UPDATE文発行 コマンド・エディター2:SELECT文発行 結果:どちらも値を返却。 コマンド・エディター1:SELECT FOR UPDATE文、UPDATE文発行 コマンド・エディター2:SELECT FOR UPDATE文発行 結果:コマンド・エディター2が待機 ただネットでDB2関連の記事を見ていた時に、「DB2場合、オラクルと違ってUNDO表領域がなく、ロック・ログイングという機能で整合性を合わせている。共有ロック時に該当行をロックするので、他が共有ロックをしようとしても待たされる」というような内容の記述がありました(すみません、URLは失念しました)。 共有ロックしてたら共有ロックすら待たされるのか・・・と疑問に思い、実際にやってみたら、あれできる? といった状況です。 また下記のような記述もありました。 >更新中のデータに対して検索を行った場合です。DB2では、検索時に共有ロックをかけます。しかし、読み取るデータが更新中の場合は、すでにそのデータに排他ロックがかかっているため、共有ロックをかけることができません。つまり、DB2では更新中のデータに読み手はアクセスできず、検索処理が待たされます。一方、Oracleでは、マルチ・バージョン一貫性制御により、UNDO表領域に保持された更新前の情報を読み込むため、読み取るデータが更新中であっても検索処理が待たされることはありません。 ttp://www.atmarkit.co.jp/fdb/rensai/rdbmsarc04/rdbmsarc04_1.html この記述を見る限り、アップデートされている行に対して、SELECT文(共有ロック)を掛けようとしても駄目と見えるのですが、SELECT FOR UPDATE文は確かに駄目ですが、SELECT文は可能です。 下記のURLのロックの互換性と同じような内容のDB2版があれば分かりやすいのですが・・・。 ttp://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html
補足
また1点不明なのが、SELECT FOR UPDATEで更新ロックが掛かると思っていたのですが、ロック状況を確認しても発行時点では共有ロックになっています。 1.SELECT FOR UPDATE発行 →更新ロック 2.UPDATE文発行 →排他ロックに切り替わる。 と思っていたのですが、間違いでしょうか。