説明
このステートメントは、セッション内でテーブルをロックし、他のセッションによる同一テーブルへの並行操作を防ぐために使用されます。特定のテーブルに対するすべてのDMLおよびDDL操作を停止する必要がある場合、このステートメントを使用してテーブルをロックできます。
説明
OceanBaseデータベースV4.3.5バージョンでは、LOCK TABLES ステートメント機能はV4.3.5 BP2バージョンから有効になります。
前提条件
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