- PR -

Oracleのロックについて

1
投稿者投稿内容
のりすけ
会議室デビュー日: 2006/05/10
投稿数: 9
投稿日時: 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でソートした場合については、ソート順にロックがかかる
のでしょうか?


以上、宜しくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-08-23 02:19
特に決まりはないと思います。
普通に考えればFETCH順でしょう。

複数件をロックする場合は、以前に実験した限りではORDER BYで
順序を揃えてあげないとデッドロックが起こりえるようでした。

SELECTで明示的にソートしない場合のFETCH順に関しては
さんざん既出なので触れずにおきます。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)