- - PR -
Oracleのロックについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-08-23 01:50
■環境:Oracle10g
お世話になります。 Oracleのロックについてご質問です。 ID_TBL +-----+--------+ | ID | STATUS | +-----+--------+ | 2 | 1 | | 1 | 1 | | 5 | 0 | | 4 | 1 | | 3 | 0 | +-----+--------+ 上記のようなテーブル、及びデータに対し、 SELECT ID FROM ID_TBL WHERE STATUS = '1' FOR UPDATE ; のようなSQLを実行しロックをかけたとします。 この場合のロックのかかり方についてですが、 Oracleの内部では、 @IDが"2","1","4"のレコードに対し、一括でロックがかかる A"2"->"1"->"4"の順(rowid順)にロックがかかる のどちらでしょうか? また、IDでソートした場合については、ソート順にロックがかかる のでしょうか? 以上、宜しくお願いいたします。 |
|
投稿日時: 2006-08-23 02:19
特に決まりはないと思います。
普通に考えればFETCH順でしょう。 複数件をロックする場合は、以前に実験した限りではORDER BYで 順序を揃えてあげないとデッドロックが起こりえるようでした。 SELECTで明示的にソートしない場合のFETCH順に関しては さんざん既出なので触れずにおきます。 |
|
投稿日時: 2006-08-23 09:13
スミマセン、質問の回答にはなっていませんが・・・
ロックが一括でかかるか? 順でかかるか? 何故知る必要があるのでしょう? のりすけさんの例でいうと、 SELECT ID FROM ID_TBL WHERE STATUS = '1' FOR UPDATE がRDBMSに適用された場合、 IDが"2","1","4"のレコードに対しては、他のセッションからはロックが取得できません。 逆に、先に IDが"2","1","4"の何れかのレコードが 他のセッションからはロックされていた場合は、 SELECT ID FROM ID_TBL WHERE STATUS = '1' FOR UPDATE は待ち状態になります。 (待ち状態の時には何れのレコードもロックしません。) つまり実際に競合が発生した際には、どちらかがロックの取得に失敗する(あるいは待たされる)という結果しかないのです。 (RDBMSのアーキテクチャーを)勉強する目的ならともかく、運用上はロックのかかり方(一括/順)は意識する必要が無いハズですが、如何でしょうか? |
1