説明
このステートメントは、指定されたパターンに基づいて1つまたは複数のテーブル、テーブルのパーティション、またはサブパーティションをロックします。
ロックされたテーブルは、トランザクションがコミットされるか、ロールバックされるか、またはロック前のセーブポイントまでロールバックされるまで、ロック状態を維持します。
説明
ロックするテーブルは、ユーザー自身のスキーマ内に存在する必要があります。または、ユーザーには LOCK ANY TABLE のシステム権限が付与されていなければなりません。
構文
LOCK TABLE [ schema. ]table_name
[ partition_extension_clause]
[, [ schema. ] table_name
[ partition_extension_clause ]
]...
IN lock_mode MODE
[ NOWAIT
| WAIT integer
] ;
partition_extension_clause:
PARTITION (partition_name, ...)
| SUBPARTITION (subpartition_name, ...)
構文の説明
| フィールド名 | 説明 |
|---|---|
| table_name | ロック対象のテーブル名を指定します。 |
| partition_name | ロック対象のパーティション名を指定します。 |
| subpartition_name | ロック対象のサブパーティション名を指定します。 |
| lock_mode | ロックモードを指定します。OceanBaseデータベースの現行バージョンでサポートされているロックモードは以下のとおりです:
|
| NOWAIT | 実行中のテーブル、パーティション、またはサブパーティションに対するロック時にロック競合が発生した場合、NOWAITを指定すると、データベースは直ちに制御権をユーザーに返します。この場合、データベースはメッセージを返して、テーブル、パーティション、またはサブパーティションが別のユーザーによってロックされていることを通知します。 |
| WAIT | ロック競合が発生した場合、ステートメントは競合するロックが解放されるまで待機し、タイムアウトするまで続けます。タイムアウトは、ユーザーが設定したinteger時間(単位:秒)です。integerの値に制限はありません。 |
例
以下の例は、パーティションテーブルを作成し、そのパーティションにロック操作を実行する方法です。
パーティションテーブル
testを作成します。ここで、SUBPARTITION TEMPLATEによって生成されるサブパーティション名は、パーティション名 + 's' + サブパーティションテンプレート名となります。例えば、p0パーティションにはサブパーティションp0ssp0、p0ssp1、p0ssp2があります。CREATE TABLE TEST(col1 INT, col2 INT) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col2) SUBPARTITION TEMPLATE ( SUBPARTITION sp0 VALUES LESS THAN (3), SUBPARTITION sp1 VALUES LESS THAN (6), SUBPARTITION sp2 VALUES LESS THAN (9) ) ( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (300) );テーブル全体
testに排他ロックをかけます。obclient> LOCK TABLE test IN EXCLUSIVE MODE; Query OK, 0 rows affectedテーブル
testのパーティションp1に排他ロックをかけます。obclient> LOCK TABLE test PARTITION (p1) IN EXCLUSIVE MODE; Query OK, 0 rows affectedテーブル
testのサブパーティションp1ssp1に排他ロックをかけます。obclient> LOCK TABLE test SUBPARTITION (p1ssp1) IN EXCLUSIVE MODE; Query OK, 0 rows affectedテーブル
testの複数のパーティションに排他ロックをかけます。obclient> LOCK TABLE test PARTITION (p1,p2) IN EXCLUSIVE MODE; Query OK, 0 rows affectedテーブル
testの複数のサブパーティションに排他ロックをかけます。obclient> LOCK TABLE test SUBPARTITION (p0ssp1,p1ssp2) IN EXCLUSIVE MODE; Query OK, 0 rows affectedテーブル
testの複数のパーティションとサブパーティションに排他ロックをかけます。obclient> LOCK TABLE test PARTITION (p1, p2), test SUBPARTITION (p0ssp0, p0ssp1) IN EXCLUSIVE MODE; Query OK, 0 rows affectedテーブル
testに存在しないパーティションに排他ロックをかけます。以下の例では、p3パーティションは存在しませんが、p0パーティションもロックに失敗し、ステートメント全体がロールバックされます。obclient> LOCK TABLE test PARTITION (p0, p3) IN EXCLUSIVE MODE; OBE-02149: Specified partition does not exist2つのクライアントでそれぞれテーブル
testにロックをかけます。ロックを保持しているクライアントには排他ロック、ロックを要求しているクライアントには共有ロックがかかります。LOCK TABLEステートメントでWAIT N/NOWAITキーワードが設定されていない場合、タイムアウト時間はステートメントのタイムアウト時間とトランザクションのタイムアウト時間の最小値になります。この例では、1秒後にロック競合エラーが報告されます。# conn1 obclient> START TRANSACTION; Query OK, 0 rows affected obclient> LOCK TABLE test IN EXCLUSIVE MODE; Query OK, 0 rows affected # conn2 obclient> START TRANSACTION; Query OK, 0 rows affected obclient> SET ob_trx_timeout = 10000000000; # 10000秒 Query OK, 0 rows affected obclient> SET ob_query_timeout = 1000000; # 1秒 Query OK, 0 rows affected # ロックを要求するクライアントは1秒後にロック競合エラーを報告します obclient> LOCK TABLE test IN SHARE MODE; OBE-30006: resource busy; acquire with WAIT timeout expired2つのクライアントでそれぞれテーブル
testにテーブルロックをかけます。ロックを保持しているクライアントには排他ロック、ロックを要求しているクライアントには共有ロックがかかり、NOWAITキーワードを使用します。LOCK TABLEステートメントでNOWAITキーワードが設定されている場合、テーブルロックの競合が発生すると即座にエラーが報告され、「NOWAIT」というメッセージがエラー情報に表示されます。このエラー情報は、ステートメントでWAIT N/NOWAITキーワードが設定されていない場合とは異なります。# conn1 obclient> START TRANSACTION; Query OK, 0 rows affected obclient> LOCK TABLE test IN EXCLUSIVE MODE; Query OK, 0 rows affected # conn2 obclient> START TRANSACTION; Query OK, 0 rows affected obclient> LOCK TABLE test IN SHARE MODE NOWAIT; OBE-00054: resource busy and acquire with NOWAIT specified or timeout expired2つのクライアントでそれぞれテーブル
testにテーブルロックをかけます。ロックを保持しているクライアントには排他ロック、ロックを要求しているクライアントには共有ロックがかかり、WAIT Nキーワードを使用します。LOCK TABLEステートメントでWAIT Nキーワードが設定されている場合、テーブルロックの競合が発生するとN秒待機します。N秒経過してもロックが解除されない場合、エラーが報告され、「timeout expired」というメッセージがエラー情報に表示されます。このエラー情報は、ステートメントでWAIT N/NOWAITキーワードが設定されていない場合とは異なります。# conn1 obclient> START TRANSACTION; Query OK, 0 rows affected obclient> LOCK TABLE test IN EXCLUSIVE MODE; Query OK, 0 rows affected # conn2 obclient> START TRANSACTION; Query OK, 0 rows affected # ロックを要求するクライアントは1秒後にロック競合エラーを報告します obclient> LOCK TABLE test IN SHARE MODE WAIT 1; OBE-00054: resource busy and acquire with NOWAIT specified or timeout expired