Oracle 10.2 - ステートメント・ロック

ODBI=2 (READ_COMMITTED)
FOR UPDATE WAIT n (X_DBMENV.DAT)

ロックのタイムアウトは、選択オペレーションにのみ設定され、その後は、更新および削除の前の読み取りにのみ設定されます。ロックはすべての選択に望ましくないステートメントに設定されるため、ロックのタイムアウトをそれ以外の選択に設定することはできません。特定のステートメントのみロックされる必要があります。挿入は待機オプションを提供せず、行のロックが解除されるのを待ちます (ブロック)。

WITH_KEY IOアクセス

 

ステップ

アクション (ユーザー)

IO$STS

メッセージ

1

挿入 (1)

OK

IOオペレーションは成功しました。

2

挿入 (2)

ブロック

 

3

削除 (2)

NR

レコードは見つかりませんでした。

4

コミット (1)

 

 

5

更新 (1)

OK

IOオペレーションは成功しました。

6

更新 (2)

ER

レコードはロックされました。

7

フェッチ (1)

OK

IOオペレーションは成功しました。

8

フェッチ (2)

OK

IOオペレーションは成功しました。

9

コミット (1)

 

 

10

削除 (1)

OK

IOオペレーションは成功しました。

11

挿入 (2)

ブロック

 

12

更新 (2) 削除 (2)

ER

レコードはロックされました。

13

コミット (1)

 

 

 

 

反転表示された2行目と11行目は、Oracleのロックのタイムアウトとは異なることに注意してください。挿入にはタイムアウトを設定できません。トランザクションがコミットされるまでブロックします。

最後のレコード読み取り IO アクセス

アクセスの結果は、更新に使った場合でのロックのタイムアウトとの違いという点において WITH_KEYと同じです。

ステップ

アクション (ユーザー)

IO$STS

メッセージ

1

挿入 (1)

OK

IOオペレーションは成功しました。

2

挿入 (2)

ブロック

 

3

コミット (1)

 

 

4

フェッチ (1)、フェッチ (2)

OK

IOオペレーションは成功しました。

5

更新 (1)

OK

IOオペレーションは成功しました。

6

更新 (2)

ER

レコードはロックされました。

7

フェッチ (1)

OK

IOオペレーションは成功しました。

8

フェッチ (2)

OK

IOオペレーションは成功しました。

9

コミット (1)

 

 

10

フェッチ (1)、フェッチ (2)

OK

IOオペレーションは成功しました。

11

削除 (1)

OK

IOオペレーションは成功しました。

12

挿入 (2)

ブロック

 

13

フェッチ (2) 更新 (2)、フェッチ(2) 削除(2)

ER

レコードはロックされました。

14

コミット (1)

 

 

 

 

このテストから、OracleがLinuxおよびWindows上で使われている場合は、どちらのプラットフォーム上でもFOR更新オプションを使用するという結論が導かれます。そうしない場合は、ロックのタイムアウトを使います。その場合でも、異なるデータベースが使われる場合は、データベースによってふるまいは異なり、場合によってはあるデータベースに特有のコードが必要になる場合があることに気をつけてください。