トランザクションでは、テーブル行 (データレコード) にオプティミスティックロックを設定することができます。データベースシステムによって、テーブル行の現在のバージョン番号がトランザクションに通知されます。
テーブル行が変更されるたびに、データベースシステムによってバージョン番号が上げられます。元のバージョン番号と現在のバージョン番号を比較することによって、ロックを設定中に読み込んだデータがまだ有効であるか、または再読込が必要であるかをデータベースアプリケーションで判断することができます。
オプティミスティックロックを取得するには、LOCK 文を使用して明示的にリクエストする必要があります。データベースオブジェクトにすでに排他ロックが存在する場合、オプティミスティックロックを設定することはできません (ロック衝突)。データベースオブジェクトにオプティミスティックロックが存在する場合は、他のユーザは引き続き排他ロック、共有ロック、または追加のオプティミスティックロックを設定することができます。
トランザクション内で、そのトランザクションによってオプティミスティックロックが設定されたテーブル行を変更する前に、オプティミスティックロック設定後に他のユーザによって対象のテーブル行が変更されていないかどうかがデータベースシステムによってチェックされます。
● テーブル行が変更されていない場合は、最初にデータベースシステムによってオプティミスティックロックが排他ロックに変換され、その後、テーブル行が変更されます。
● 他のトランザクションによってテーブル行が変更されている場合、変更はデータベースシステムによって拒否され、オプティミスティックロックがリリースされます。
オプティミスティックロックは、分離レベルが 0、1、10、または 15 のうちのいずれかに設定されている場合にのみ有用です。
参照: