説明
このステートメントは、セッション内でテーブルをロックし、他のセッションによる同一テーブルへの同時実行操作を防ぐために使用されます。特定のテーブルに対するすべてのDMLおよびDDL操作を停止する必要がある場合、このステートメントを使用してテーブルをロックできます。
前提条件
LOCK TABLESステートメントを使用する前に、以下のテナントレベル構成パラメータを有効にする必要があります:ALTER SYSTEM SET enable_lock_priority = TRUE;上記テナントレベル構成パラメータの詳細については、enable_lock_priorityを参照してください。
注意
対応するテナントの
enable_lock_priorityを有効にしても、すべてのノードが即座に設定を認識するわけではありません。そのため、GV$OB_PARAMETERSビューを照会して、すべてのノード上の対応する構成パラメータの値を確認し、テナント内のすべてのマシンで有効になっていることを保証する必要があります。クラスタにプロキシ接続を使用して接続する場合は、プロキシの以下の設定も有効にする必要があります:
ALTER PROXYCONFIG SET proxy_id = 1; ALTER PROXYCONFIG SET client_session_id_version = 2; ALTER PROXYCONFIG SET enable_single_leader_node_routing = false;上記プロキシ設定の詳細については、
proxy_id、client_session_id_version、およびenable_single_leader_node_routingのドキュメントを参照してください。
使用制限と注意事項
- テーブルロックをかけた後は、単独で
RENAME TABLEを実行することは推奨されません。RENAME TABLEを実行する前に、書き込みロック (WRITE) を取得することをお勧めします。 - 同一セッションでロックした後、ロックされたテーブルの読み書きはサポートされず、
RENAME TABLE操作のみが許可されます。 - テーブルエイリアス (
alias) にロックをかけることは、元のテーブル名にロックをかけることと同じです。 - 現在のセッションがテーブルロックを保持している状態で再度
LOCK TABLESを実行すると、複数のテーブルロックがかかります。 START TRANSACTIONではロックは解除されません。ロックを解除するには、UNLOCK TABLESまたはセッション切断が必要です。LOCK TABLESはトランザクションを自動的にコミットしません。- ビュー (View) へのロックはサポートされていません。
- トリガー/外部キーが関連するテーブルについては、元のテーブルにのみロックがかかります。例えば、外部キーが関連するテーブル内で子テーブルにロックをかけても、親テーブルにはロックがかからない場合があります。同様に、親テーブルにロックをかけても、子テーブルにはロックがかからない場合があります。
LOCK TABLESステートメントの操作対象が一時テーブルの場合、ロックはかからず、エラーも報告されません。
権限要件
LOCK TABLES ステートメントを実行するには、現在のユーザーが少なくとも対象オブジェクトに対する LOCK TABLES 権限を持っている必要があります。OceanBaseデータベースの権限に関する詳細は、MySQLモードの権限分類を参照してください。
構文
LOCK {TABLE | TABLES}
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type ...];
lock_type:
READ [LOCAL]
| [LOW_PRIORTY] WRITE
構文説明
フィールド名 |
説明 |
|---|---|
| LOCK {TABLE | TABLES} | テーブルまたは複数のテーブルに対するロック操作を示します。LOCK TABLE は LOCK TABLES の同義語です。 |
| table_name | ロックするテーブルの名前を指定します。 |
| [AS] alias | テーブルにエイリアスを指定します。 |
| lock_type | テーブルのロックタイプを指定します。テーブルロックタイプの詳細については、後述の lock_type を参照してください。 |
lock_type
READ [LOCAL]:READ:すべてのセッションはロックされたテーブルを読み取ることはできますが、そのテーブルを変更することはできません(ロックをかけたセッションも含む)。複数のセッションが同時に読み取りロック操作を実行することをサポートします。READ LOCAL:READの動作と同じです。
[LOW_PRIORITY] WRITE:WRITE:テーブルに対して書き込みロック操作を行います。現在のバージョンでは、WRITEは読み取りに影響しません。LOW_PRIORITY WRITE:WRITEの動作と同じです。
例
サンプルテーブルを作成し、テストデータを挿入します。
テーブル
test_tbl1を作成します。CREATE TABLE test_tbl1(col1 INT, col2 VARCHAR(25), col3 INT);テーブル
test_tbl1にテストデータを挿入します。INSERT INTO test_tbl1 VALUES(1, 'A1', 100);
テナントレベルのパラメータ
enable_lock_priorityを有効にします。ALTER SYSTEM SET enable_lock_priority = TRUE;以下のステートメントを実行して、トランザクションをコミットします。
COMMIT;セッション1で以下のステートメントを実行し、テーブル
test_tbl1に読み取りロックを設定します。LOCK TABLES test_tbl1 READ;セッション1で以下のステートメントを実行し、テーブル
test_tbl1のデータを確認します。SELECT * FROM test_tbl1;実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | A1 | 100 | +------+------+------+ 1 row in setセッション1で以下のステートメントを実行し、テーブル
test_tbl1に1行のデータを挿入します。INSERT INTO test_tbl1 VALUES(2, 'A2', 200);実行結果は次のとおりです:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transactionセッション2で以下のステートメントを実行し、テーブル
test_tbl1のデータを確認します。SELECT * FROM test_tbl1;実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | A1 | 100 | +------+------+------+ 1 row in setセッション2で以下のステートメントを実行し、テーブル
test_tbl1に1行のデータを挿入します。INSERT INTO test_tbl1 VALUES(2, 'A2', 200);実行結果は次のとおりです:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transactionセッション1で以下のステートメントを実行し、現在のセッションが保持するすべてのテーブルロックを解除します。
UNLOCK TABLES;セッション1で以下のステートメントを実行し、テーブル
test_tbl1に1行のデータを挿入します。INSERT INTO test_tbl1 VALUES(2, 'A2', 200);実行結果は次のとおりです:
Query OK, 1 row affectedセッション2で以下のステートメントを実行し、テーブル
test_tbl1に1行のデータを挿入します。INSERT INTO test_tbl1 VALUES(3, 'A3', 300);実行結果は次のとおりです:
Query OK, 1 row affected