物理ロック

データ管理 > SQLに関する考慮事項 > 構成とパフォーマンス > ロック > 排他ロックと共有ロック

SELECT ...FOR UPDATE文は、Oracle、MS-SQL Server、DB2 UDBで使用できます。これらのRDBMSでは、行レベルのロックがサポートされています。したがって、選択したロック方式に基づいてロックが要求されると、Magicは、ゲートウェイにロックを使用して再びレコードを読み取るように指示します。トランザクションが開始されていない場合は、ゲートウェイによって開始されます。その後、ゲートウェイは、FOR UPDATE句を使用して現在のレコードを読み取ります。MS-SQL Serverの場合は、UPDLOCKヒントを使用します。

上記のプロシージャによって、Magic以外のアプリケーションを含むどのアプリケーションでも、トランザクションが完了するまでレコードを更新することはできません。通常は、更新が行われた後、トランザクションが行われます。

例:

現在のレコードを取得します。

SELECT empnum, ename, deptno, rowid
FROM emp
WHERE empnum= 1

Returned values:1 , John, 30,1111

ロックを要求します。

SELECT empnum, ename, deptno, rowid
FROM emp
WHERE empnum= 1111
FOR UPDATE NO WAIT
Returned values:1 , John, 30,1111

deptnoが40に変更されたとします。

UPDATE emp SET deptno= 40
WHERE rowid= 1111

バッチタスクでは、[ロック方式]が「I=即時」に設定されている場合、ゲートウェイは、前もってデータビュー全体をロックすることができます。
Oracleでは、SELECT文にFOR UPDATE句およびORDER BY句を追加して発行することができます。したがって、カーソルがタスクの最初に定義されている場合、FOR UPDATE句を使用して宣言されます。その後、このカーソルから全てのレコードが取得されます。
DB2 UDB は、Oracleのようにプロシージャは使用できません。その代わりに、カーソルがオープンし、各レコードに対してFOR UPDATE句と一緒に他のカーソルがオープンされます。