LOCK

Name

LOCK -- はテーブルをロックします

Synopsis

LOCK TABLE <name> [, ...] IN <lockmode> MODE [ NOWAIT ]

ここで、 lockmode は次のいずれかです。

ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE

Description

LOCK TABLE はテーブルレベルのロックを取得し、必要に応じて競合するロックが解放されるのを待ちます。 NOWAIT を指定すると、 LOCK TABLE は目的のロックの取得を待機しません。すぐに取得できない場合、コマンドは中止され、エラーが発生します。ロックが取得されると、現在のトランザクションの残りの間ロックが保持されます。( UNLOCK TABLE コマンドはありません。ロックは常にトランザクション終了時に解放されます。)

テーブルを参照するコマンドのロックを自動的に取得する場合、AdvancedServerは常に可能な限り最小のロックモードを使用します。 LOCK TABLE は、より制限的なロックが必要な場合に備えています。たとえば、アプリケーションがコミットされた分離レベルでトランザクションを実行し、テーブルのデータがトランザクションの間安定していることを確認する必要があるとします。これを実現するには、クエリを実行する前にテーブルで SHARE ロックモードを取得します。これにより、同時データ変更が防止され、テーブルの後続の読み取りでコミット済みデータの安定したビューが表示されます。これは、 SHARE ロックモードがライターによって取得された ROW EXCLUSIVE ロックと競合し、 LOCK TABLE 名 IN SHARE MODE ステートメントが待機するためです ROW EXCLUSIVE モードの同時保有者がコミットまたはロールバックするまで。したがって、ロックを取得すると、未コミットの未解決の書き込みはありません。さらに、ロックを解除するまで何も開始できません。

シリアライズ可能な分離レベルでトランザクションを実行するときに同様の効果を得るには、データ変更ステートメントを実行する前に LOCK TABLE ステートメントを実行する必要があります。シリアル化可能なトランザクションのデータのビューは、最初のデータ変更ステートメントが始まると凍結されます。後の LOCK TABLE は、同時書き込みを防ぎますが、トランザクションが読み取るものが最新のコミット値に対応することを保証しません。

この種のトランザクションがテーブル内のデータを変更する場合、 SHARE モードではなく SHARE ROW EXCLUSIVE ロックモードを使用する必要があります。

これにより、このタイプのトランザクションは一度に1つだけ実行されます。これがないと、デッドロックが発生する可能性があります。2つのトランザクションが両方とも SHARE モードを取得し、 ROW EXCLUSIVE モードも取得して実際に更新を実行できない場合があります。(トランザクションのロックは競合しないため、トランザクションは SHARE モードを保持している場合は ROW EXCLUSIVE モードを取得できますが、他の誰かが SHARE モードを保持している場合は取得できません。)デッドロックを回避するには、すべてのトランザクションが同じオブジェクトを同じ順序で使用し、1つのオブジェクトに複数のロックモードが関係している場合、トランザクションは常に最も制限の厳しいモードを最初に取得する必要があります。

Parameters

name

ロックする既存のテーブルの名前(オプションでスキーマ修飾)。

コマンド LOCK TABLE a, b; は LOCK TABLE a; LOCK TABLE b と同等です。テーブルは、 LOCK TABLE コマンドで指定された順序で1つずつロックされます。

lockmode

ロックモードは、このロックが競合するロックを指定します。

ロックモードが指定されていない場合、サーバーは最も制限の厳しいモード ACCESS EXCLUSIVE を使用します。( ACCESS EXCLUSIVE はOracleデータベースと互換性がありません。AdvancedServerでは、この構成モードにより、他のトランザクションがロックされたテーブルにいかなる方法でもアクセスできなくなります。)

NOWAIT

LOCK TABLE は競合するロックが解放されるまで待機しないことを指定します。指定したロックを待機せずにすぐに取得できない場合、トランザクションは中止されます。

Notes

LOCK のすべての形式には、 UPDATE または DELETE 特権が必要です。

LOCK TABLE は、トランザクションが終了するとすぐにロックが解除されるため、トランザクションブロック内でのみ役立ちます。トランザクションブロックの外側に表示される LOCK TABLE コマンドは自己完結型トランザクションを形成するため、ロックは取得されるとすぐに削除されます。

LOCK TABLE はテーブルレベルのロックのみを扱うため、 ROW を含むモード名はすべて誤った呼び名です。通常、これらのモード名は、ロックされたテーブル内で行レベルのロックを取得するユーザーの意図を示すものとして読む必要があります。また、 ROW EXCLUSIVE モードは共有可能なテーブルロックです。 LOCK TABLE に関する限り、すべてのロックモードは同じセマンティクスを持ち、どのモードがどのモードと競合するかについてのルールのみが異なることに注意してください。