25章 ロック
今回はロックについて学んでいきましょう。
ロックとは同じ行に対する更新をどちらか待機させ、同時更新を防ぐ機能です。
このロックの機能により同時更新によるデータの破損を防ぐことができます。
行ロック
データベース管理システムには複数のユーザが同じデータを更新することがあるため、
同時に実行されてデータの不整合が発生しないようにロックという機構を使用して、
同時実行が行わないようにしています。
ロックが取得されるタイミングはDML文実行時です。
DML文を実行した時に更新対象の行にロックを取得します。
Oracle以外のRDBMSでは表全体にロックを取得する場合もありますが、
Oracleの場合は、更新対象の行のみのロックであるため、
他の行はDML文による更新が可能です。このロックを行排他ロックと言います。
また行排他ロックを取得すると同時に表共有ロックも取得されています。
排他ロック:その他のロックと共有できないロック
共有ロック:その他のロックと共有できるロック
DML文実行時に表に対して共有ロックをかける理由としては、
表が削除(DROP TABLE文)されないようにするためです。
そしてロックが解放されるタイミングはトランザクションが終了した時です。
つまりCOMMIT,ROLLBACKのコマンド等のタイミングです。
ではロックを取得しているタイミングで別のユーザが対象の行に
DMLを実行した場合はどうなるのでしょうか。
DML文を実行すると、そのユーザは待機状態となります。
プロンプトが返ってこない状態となります。
そのプロンプトはロックを取得したユーザが
トランザクションを終了した時点で戻ってきます。
このようにロックという機能を使用することで
同じデータに対する同時実行を制御しデータの整合性を保っています。
デッドロック
次にデッドロックについてです。
デッドロックとはお互いのセッションがお互いのロックを
待ち続けてしまう状況のことを言います。
例えば以下のような状況でDML文を実行したとします。
上記の様な状況となってしまうと、お互いが待ち続けてしまうのです。これをデッドロックと言います。
Oracleはデッドロックを検知すると、後に取得しようとしたセッションのロックを解除しこれを防ぎます。
※デッドロックの詳細情報はトレースファイルに出力されます。
このような状況が発生する場合はアプリケーションの仕組みが良くない可能性があるので、
トレースの情報を確認し、アプリケーションの管理者と相談してください。