Purpose
This statement is used to lock one or more tables, partitions, or subpartitions in the specified mode.
Locked tables remain locked until the transaction is committed, rolled back, or rolled back to a savepoint before the lock was placed.
Note
The table to be locked must be in the user's own schema, or the user must have the LOCK ANY TABLE system privilege.
Syntax
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, ...)
Syntax
| Field | Description |
|---|---|
| table_name | The name of the table to be locked. |
| partition_name | The name of the partition to be locked. |
| subpartition_name | The name of the subpartition to be locked. |
| lock_mode | The lock mode. OceanBase Database supports the following lock modes in the current version:
|
| NOWAIT | If a lock conflict occurs when locking the table, partition, or subpartition, specifying NOWAIT allows the database to immediately return control to the user. In this case, the database will return a message indicating that the table, partition, or subpartition is locked by another user. |
| WAIT | If a lock conflict occurs, the statement should wait for the conflicting lock to be released, up to the timeout period specified by the user's integer value (in seconds). The integer value has no upper limit. |
Examples
The following example demonstrates how to create a subpartitioned table and lock its partitions.
Create a subpartitioned table
test. The subpartition names generated bySUBPARTITION TEMPLATEare formed by appending 's' and the subpartition template name to the partition name. For example, thep0partition has subpartitions namedp0ssp0,p0ssp1, andp0ssp2.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) );Lock the entire
testtable with an exclusive lock.obclient> LOCK TABLE test IN EXCLUSIVE MODE;Lock the
p1partition of thetesttable with an exclusive lock.obclient> LOCK TABLE test PARTITION (p1) IN EXCLUSIVE MODE;Lock the
p1ssp1subpartition of thetesttable with an exclusive lock.obclient> LOCK TABLE test SUBPARTITION (p1ssp1) IN EXCLUSIVE MODE;Lock multiple partitions of the
testtable with exclusive locks.obclient> LOCK TABLE test PARTITION (p1, p2) IN EXCLUSIVE MODE;Lock multiple subpartitions of the
testtable with exclusive locks.obclient> LOCK TABLE test SUBPARTITION (p0ssp1, p1ssp2) IN EXCLUSIVE MODE;Lock multiple partitions and subpartitions of the
testtable with exclusive locks.obclient> LOCK TABLE test PARTITION (p1, p2), test SUBPARTITION (p0ssp0, p0ssp1) IN EXCLUSIVE MODE;Attempt to lock a non-existent partition
p3of thetesttable. In this example,p3does not exist, andp0will also fail to be locked, causing the entire statement to roll back.obclient> LOCK TABLE test PARTITION (p0, p3) IN EXCLUSIVE MODE; OBE-02149: Specified partition does not existLock the
testtable in two client sessions. One client holds an exclusive lock, while the other requests a shared lock. When theLOCK TABLEstatement does not specify theWAIT NorNOWAITkeyword, the timeout is determined by the minimum of the statement timeout and transaction timeout. In this example, the lock conflict error will be reported after 1 second.# conn1 obclient> START TRANSACTION; obclient> LOCK TABLE test IN EXCLUSIVE MODE; # conn2 obclient> START TRANSACTION; obclient> SET ob_trx_timeout = 10000000000; # 10000 seconds obclient> SET ob_query_timeout = 1000000; # 1 second # The requesting client will receive a lock conflict error after 1 second obclient> LOCK TABLE test IN SHARE MODE; OBE-30006: resource busy; acquire with WAIT timeout expiredLock the
testtable in two client sessions. One client holds an exclusive lock, while the other requests a shared lock, and theNOWAITkeyword is used. When theLOCK TABLEstatement specifies theNOWAITkeyword, if a table lock conflict occurs, an error is immediately returned, and the error message will include "NOWAIT". This error message is different from when theWAIT NorNOWAITkeyword is not specified.# conn1 obclient> START TRANSACTION; obclient> LOCK TABLE test IN EXCLUSIVE MODE; # conn2 obclient> START TRANSACTION; obclient> LOCK TABLE test IN SHARE MODE NOWAIT; OBE-00054: resource busy and acquire with NOWAIT specified or timeout expiredLock the
testtable in two client sessions. One client holds an exclusive lock, while the other requests a shared lock, and theWAIT Nkeyword is used. When theLOCK TABLEstatement specifies theWAIT Nkeyword, if a table lock conflict occurs, the system will wait for N seconds. If the lock is not released within N seconds, an error will be returned, and the error message will include "timeout expired". This error message is different from when theWAIT NorNOWAITkeyword is not specified.# conn1 obclient> START TRANSACTION; obclient> LOCK TABLE test IN EXCLUSIVE MODE; # conn2 obclient> START TRANSACTION; # The requesting client will receive a lock conflict error after 1 second obclient> LOCK TABLE test IN SHARE MODE WAIT 1; OBE-00054: resource busy and acquire with NOWAIT specified or timeout expired