物理ロックは、データベースによって管理されます。データベースは、ロックを管理します。Magic xpaリクエスト/ステートメントにもとづいてロックのオープンや解放を行います。
物理ロックがかかると、他のユーザは変更することができず、アプリケーションやデータベースツールによって同じレコードをロックすることもできません。
物理ロックは、常に物理トランザクション内で行われます。トランザクションがコミットまたはロールバックによって開始された場合にだけロックが開始され、トランザクションの終了時にのみロックは終了します。
物理ロックに以下の2つのタイプがあります。
暗黙のロック …… DMLコマンドは、トランザクションが終了するまでトランザクションによって自動的にロックが発生します。Magic xpaがUPDATE、DELETEまたはINSERTコマンドを送ると、データベースはユーザの意図に関係なくDMLの結果セット内のすべてのレコードを自動的にロックします。このロックの期間は、DMLコマンドが送られてからトランザクションの終了までになります。
注意: |
Magic xpaで「ロックなし」を指定しても、DMLが送られるとロックはデータベースで自動的に行われます。 |
明示ロック …… データが他のユーザによって変更されないようにするために、通常は計画的なDMLの前に、明示的なロックがユーザのリクエストによって作成されます。
SELECT ...FOR UPDATE文は、Oracle、MS-SQL Serverで使用できます。これらのRDBMSでは、行レベルのロックがサポートされています。したがって、選択したロック方式に基づいてロックが要求されると、Magic xpaは、ゲートウェイにロックを使用して再びレコードを読み取るように指示します。トランザクションが開始されていない場合は、ゲートウェイによって開始されます。その後、ゲートウェイは、FOR UPDATE句を使用して現在のレコードを読み取ります。MS-SQL Serverの場合は、UPDLOCKヒントを使用します。
上記のプロシージャによって、Magic xpa以外のアプリケーションを含むどのアプリケーションでも、トランザクションが完了するまでレコードを更新することはできません。通常は、更新が行われた後、トランザクションが行われます。
物理ロックのプロセス
1. ロックフェーズ
フック …… Magic xpaは、レコードがロックフェーズまで変更されないことを確認します。Magic xpaは、最初に読み込まれた新しい値と、ロックによるSELECTで読み込まれた値を比較します。
2. 更新フェース
更新フェースでは、データが変更されたかどうかを確認しません。これはレコードがロックされたからです。これによってユーザは変更することができません。
Magic xpaは、書込みモードでアクセスされたテーブルをロックするだけです。読込みモードでオープンしたテーブルではロックされません。このパラメータは、タスクの[データソース]テーブル(Ctrl+D)で設定することができます。
例:
現在のレコードを取得します。
SELECT empnum, ename, deptno, rowid Returned values:1 , John, 30,1111 |
ロックを要求します。
SELECT empnum, ename, deptno, rowid |
deptnoが40に変更されたとします。
UPDATE emp SET deptno= 40 |
バッチタスクでは、[ロック方式]特性が「I=即時」に設定されている場合、ゲートウェイは、前もってデータビュー全体をロックすることができます。
Oracleでは、SELECT文にFOR UPDATE句およびORDER BY句を追加して発行することができます。したがって、カーソルがタスクの最初に定義されている場合、FOR UPDATE句を使用して宣言されます。その後、このカーソルから全てのレコードが取得されます。