首批通过分布式安全可靠测评,为关键业务系统打造
LOCK TABLE
更新时间:2026-07-15 20:42:46
描述
该语句根据指定模式锁定一个或多个表、表的分区或者二级分区。
上锁的表将保持上锁状态,直至事务提交、回滚或者回滚到上锁前的 Savepoint。
说明
要锁定的表必须在用户自己的 Schema 中,或者用户必须具有 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 | 如果发生锁冲突,那么语句应该等待冲突的锁释放,直到超时,即用户设置的 interger 时间(单位为秒)。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 exist在两个客户端上分别对表
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 expired在两个客户端上分别对表
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 expired在两个客户端上分别对表
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