
DB2の共有ロックについて。
DB2 Express-C 9.7を利用していますが、コマンドエディターを複数起動し、共有ロックの動きを確認したいと思っています。
コマンドエディターAでSELECT文を発行し、コマンドエディターBでSELECT文を発行した場合、想定ではコマンドエディターBのSELECT文は結果が返却されず待ち状態になると考えていました。ところが待ち状態にならずに値が返却されました。
コマンドエディターAの設定で自動コミットのチェックを外しても外さなくても同様です。また分離レベルは特に明示的に変更していないのでデフォルトのREAD_COMMITEDになっていると思います。
何か根本的におかしいことをしているでしょうか? よろしければアドバイスを頂ければと思います。
No.1ベストアンサー
- 回答日時:
DB2の排他制御は、そんなに詳しくないですが。
。。排他制御は、RDBMSにより、仕組み、細かな仕様に差がある部分です。それをいろいろなオプションを組み合わせることで、ほぼ同等、あるいは代替手段として使用できるように各RDBMSで段階的に実装しています。
SELECT同士であれば、一方が FOR UPDATE などで更新前提あるいは排他的なオプションを指定した検索をしなければ、共用(排他制御による待ちにはならない)できるのは当然の動きと思います。
この回答への補足
また1点不明なのが、SELECT FOR UPDATEで更新ロックが掛かると思っていたのですが、ロック状況を確認しても発行時点では共有ロックになっています。
1.SELECT FOR UPDATE発行
→更新ロック
2.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PostgreSQL リストアエラー
-
ACCESS VBA;コマンドボックス...
-
CSVファイルをBULK INSERTでSQL...
-
tar.gzファイルのリストアについて
-
oracle spool SJIS → UTF-8
-
psql でのエラー出力について
-
ファイルに記述されている複数...
-
AS400でのライブラリ配下の全て...
-
Oracle / UNIX ファイルコマン...
-
Oracle初心者です。 shutdownコ...
-
【ACCESS】コマンドボタンのク...
-
OSQLの起動について
-
アクセスで、OLEサーバーも...
-
PL/pgSQL 引数の数
-
新規作成したPostgresqlデータ...
-
SQLiteファイルへの同時アクセ...
-
テーブル単位のリストア
-
PostgreSQLについて教えてくだ...
-
ディスク上のサイズの乖離が大...
-
pg_restoreでエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
oracle spool SJIS → UTF-8
-
Windows版 pg_dumpの結果をログ...
-
Query OK, 0 rows affected
-
tar.gzファイルのリストアについて
-
CSVファイルをBULK INSERTでSQL...
-
ファイルに記述されている複数...
-
ACCESS VBA;コマンドボックス...
-
psql でのエラー出力について
-
OSQLの起動について
-
SQLCMD コマンドでコマンド待機...
-
date型に空白を入れるとエラー...
-
キャッシュしたクエリを確認したい
-
PostgreSQL リストアエラー
-
Oracle8iのBLOBに画像を登録す...
-
コマンドと関数の違い
-
SQL+Plusの訂正
-
ACCESSの保存
-
Oracle / UNIX ファイルコマン...
-
データベースのメンテナンスに...
-
shellからpostgresqlへの変数の...
おすすめ情報