論理ロックは、ロックのシミュレーションです。実際に外部ロックがデータベースに発行されることはありません。Magic xpaは、ロックを行う代わりに、レコードが最初に読み込まれた時から他のユーザによって変更されたレコードデータの内容がデータベースに書き込まれないようにするため、ソフトウェアによるチェックを行います。
論理的ロックでは、他のユーザが同じレコードを更新するのを防ぐことができません、レコードが変更された場合に自身の更新を防ぐことができるだけです。Magic xpaは、ロック開始の時点と、更新段階の2回レコードをチェックします。
論理ロックは、失われた更新(Loast Update)の防止を支援します。
ロックが要求され、Magic xpaがゲートウェイにロックを使用してレコードを読み取るように指示すると、ゲートウェイはレコードを読み取り、読み取ったレコードの値を保持します。
その後、UPDATE文が[レコード後]で発行されると、全てのカラム、Magic xpaで呼び出されたフィールドがWHERE句に追加されます。
その間、ロックされていないレコードが別のユーザによって変更された場合、ゲートウェイによって、レコードが別のユーザによって変更されたというメッセージが送信され、UPDATEは失敗します。
論理ロックは、2つの状況で使用することができます。各状況、実装は異なります。
遅延トランザクション …… 遅延トランザクションは、データベースではなくキャッシュに保存されます。これは、物理ロックが発行できないことを意味します。
物理トランザクション …… データベース/ゲートウェイがレコードレベルでのロックをサポートしない場合、物理トランザクションが使用されます。
論理ロックのタイプ
論理ロックには以下の2種類あります。
物理トランザクション内の論理ロック …… データベース/ゲートウェイがレコードレベルでのロックをサポートしない場合、物理トランザクションが使用されます。この種のロックでは、外部ロックはデータベースに送信されません。しかし、DMLコマンドを送ることでトランザクションの終了まで保持される暗黙のロックが発生します。
遅延トランザクション内の論理ロック …… 遅延トランザクション内のすべての変更はトランザクションキャッシュで保存されます。そして、トランザクションの終了時にのみ、データベースに物理的に書き込まれます。これは、物理ロックが発行できないことを意味します。
論理ロックのプロセス
論理ロックは、データベースで管理されません。したがって、2回チェックされます。最初は、ロックが要求された時点でチェックされ(ロックフェース)、2回めは更新がデータベースに送信される時です。
1. ロックフェーズ
フック …… Magic xpaは、レコードがロックフェースまで変更されないことを確認します。Magic xpaは、最初に読み込まれた新しい値と、ロックによるSELECTで読み込まれた値を比較します。
2. 更新フェース
遅延トランザクションの終了時、DMLコマンドの全ては、データベースに送信されます。この段階では、レコードが変更されていないかどうかの2回目のチェックが実行されます。このチェックは、トランザクションが終了するまで論理ロックの段階から必要です、他のユーザはレコードを変更することができます。Magic xpaは、[更新レコード識別]特性で定義されたレコード・フィールドを含むWHERE句を持つUPDATE/DELETEコマンドを送ります。
プラットホーム仕様
MS-SQL Serverでは、論理ロックと物理ロックの両方がサポートされています。論理ロックを使用するには、[データベース特性]ダイアログの[データベース情報]特性で「SQL_PHYSICAL_LOCKING=N」というフラグを指定する必要があります。
ODBCではページレベルのロックのみがサポートされていますが、ページレベルのロックはロックの問題を引き起こす可能性があります。したがって、実際にはレコードがロックされない論理ロック方式が使用されます。この場合、整合性を保つために、レコードが論理的にロックされた時から更新まで、レコードが変更されないことが保証されます。
例:
現在のレコードを取得します。
SELECT empnum, ename, deptno |
ロックを要求します。
SELECT empnum, ename, deptno |
deptnoが40に変更されたとします。
UPDATE emp SET deptno= 40 |
ODBCゲートウェイは、アクセスしたテーブルでレコードロックまたはFOR UPDATE文が使用できることが想定できないため、論理ロック動作を使用します。