LOCK
更新时间:2026-06-24
锁表。
语法
SQL
1 LOCK [TABLE] [ONLY] name [ * ] [, ...] [IN lockmode MODE] [NOWAIT]
2 ```
3
4 其中`lockmode`是以下之一:
5
6 ``` sql
7 ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
8 | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
9 ```
10
11
12
13## 描述
14
15`LOCK TABLE`获取表级别的锁,必要时等待释放任何冲突的锁。 如果指定了`NOWAIT`,则`LOCK TABLE`不会等待获取所需的锁:如果无法立即获取,则命令将中止并发出错误。一旦获得,该锁将在当前事务的其余部分保持。 没有`UNLOCK TABLE`命令;锁始终在事务结束时释放。
16
17 当自动获取引用表的命令的锁时,PalopgMPP数据库始终使用限制最小的锁模式。 `LOCK TABLE`提供了可能需要更多限制性锁定的情况。例如,假设应用程序在*Read Committed*隔离级别上运行事务,并且需要确保表中的数据在事务期间保持稳定。为此,可以在查询之前在表上获得`SHARE`锁定模式。
18
19 这将防止并发数据更改,并确保后续读取表时都能看到已提交数据的稳定视图,因为`SHARE`锁定模式与写入者获取的`ROW EXCLUSIVE`锁冲突, 并且您的`LOCK TABLE name IN SHARE MODE`语句将等待直到任何并发持有者`ROW EXCLUSIVE`模式的锁将锁定提交或回滚。因此,一旦获得了锁,就不会有未提交的未完成的写操作。此外,在释放锁之前,任何人都无法开始。
20
21 为了在`REPEATABLE READ`或`SERIALIZABLE`隔离级别下运行事务时达到类似的效果,必须在执行任何`SELECT`或数据修改语句之前执行`LOCK TABLE`语句。当`REPEATABLE READ`或`SERIALIZABLE`事务的数据视图的第一个`SELECT`或数据修改语句开始时,将被冻结。事务中稍后的`LOCK TABLE`仍将阻止并发写入 - 但不能确保事务读取的内容与最新的提交值相对应。
22
23 如果此类事务要更改表中的数据,则应使用`SHARE ROW EXCLUSIVE`锁定模式而不是`SHARE`模式。这样可以确保一次仅运行一个这种类型的事务。否则,可能会导致死锁:两个事务可能都同时获取`SHARE`模式,然后又无法获取`ROW EXCLUSIVE`模式来实际执行其更新。 请注意,事务自身的锁永远不会发生冲突,因此,当事务拥有`SHARE`模式时,它可以获取`ROW EXCLUSIVE`模式,但如果其他人拥有`SHARE`模式,则不行。为避免死锁,请确保所有事务以相同的顺序获取对相同对象的锁定,并且如果单个对象涉及多个锁定模式,则事务应始终首先获取限制性最强的模式。
24
25
26
27## 参数
28
29该SQL命令参数说明见下
30
31 `name`
32 : 要锁定的现有表的名称(可以是schema限定)。 如果指定`ONLY`,则仅锁定该表。如果未指定`ONLY`,则表及其所有子表(如果有)将被锁定。(可选)可以在表名称后指定`*`,以明确指示包括子表。如果给出了多个表,则表将按照`LOCK TABLE`命令中指定的顺序一张一张地锁定。
33
34 `lockmode`
35 : 锁定模式指定与该锁定冲突的锁定。 如果未指定锁定模式,则使用限制最大的`ACCESS EXCLUSIVE`模式。 锁定方式如下:
36
37 - ACCESS SHARE — 仅与`ACCESS EXCLUSIVE`锁定模式冲突。 `SELECT`命令在引用的表上获得此模式的锁定。通常,任何仅读取表而不修改表的查询都将获得此锁定模式。
38
39 - ROW SHARE — 与`EXCLUSIVE`和`ACCESS EXCLUSIVE`锁定模式冲突。 `SELECT FOR SHARE`命令自动在目标表上获得此模式的锁定(除了在已引用但未选择`FOR SHARE`的任何其他表上的`ACCESS SHARE`锁定之外)。
40
41 - ROW EXCLUSIVE — 与`SHARE`,`SHARE ROW EXCLUSIVE`, `EXCLUSIVE`和`ACCESS EXCLUSIVE`锁定模式冲突。`INSERT`和`COPY`命令自动在目标表上获取此锁定模式(除了对任何其他引用表的`ACCESS SHARE`锁定外)。
42
43 - SHARE UPDATE EXCLUSIVE — 与`SHARE UPDATE EXCLUSIVE`, `SHARE`,`SHARE ROW EXCLUSIVE`,`EXCLUSIVE`和`ACCESS EXCLUSIVE`锁定模式冲突。此模式可防止表发生并发schema更改和`VACUUM`运行。由`VACUUM`(无`FULL`)在堆表和`ANALYZE`上获取。
44
45 - SHARE — 与`ROW EXCLUSIVE`,`SHARE UPDATE EXCLUSIVE`, `SHARE ROW EXCLUSIVE, EXCLUSIVE`和`ACCESS EXCLUSIVE`锁定模式冲突。 此模式可防止表发生并发数据更改。 由`CREATE INDEX`自动获取。
46
47 - SHARE ROW EXCLUSIVE — 与`ROW EXCLUSIVE`,`SHARE UPDATE EXCLUSIVE`, `SHARE`,`SHARE ROW EXCLUSIVE`,`EXCLUSIVE`和`ACCESS EXCLUSIVE`锁定模式冲突。任何PalopgMPP数据库命令都不会自动获取此锁定模式。
48
49 - EXCLUSIVE — 与`ROW SHARE`,`ROW EXCLUSIVE`,`SHARE UPDATE EXCLUSIVE`, `SHARE`,`SHARE ROW EXCLUSIVE`,`EXCLUSIVE`和`ACCESS EXCLUSIVE`锁定模式冲突。此模式仅允许并发的`ACCESS SHARE`锁定,即,只有从表中读取的数据才能与持有该锁定模式的事务并行进行。对于PalopgMPP数据库中的`UPDATE`,`SELECT FOR UPDATE`和`DELETE`,此锁定模式是自动获取的。
50
51 - ACCESS EXCLUSIVE — 与所有模式的锁定(`ACCESS SHARE`,`ROW SHARE`, `ROW EXCLUSIVE`,`SHARE UPDATE EXCLUSIVE`,`SHARE`, `SHARE ROW EXCLUSIVE`,`EXCLUSIVE`和`ACCESS EXCLUSIVE`)冲突。 这种模式保证了持有者是唯一以任何方式访问表的事务。 由`ALTER TABLE`,`DROP TABLE`,`TRUNCATE`, `REINDEX`,`CLUSTER`和`VACUUM FULL`命令自动获取。这是未明确指定模式的`LOCK TABLE`语句的默认锁定模式。`VACUUM`(无`FULL`)也会在处理过程中在列存表上短暂获取此锁。
52
53 注意:默认情况下,PalopgMPP数据库为堆表上的`DELETE`, `UPDATE`和`SELECT FOR UPDATE`操作获取表上的`EXCLUSIVE`锁。启用全局死锁检测器后,堆表上操作的锁定模式为`ROW EXCLUSIVE`。
54
55
56 `NOWAIT`
57 : 指定`LOCK TABLE`不等待任何冲突的锁被释放:如果不等待就无法立即获取指定的锁,则事务中止。
58
59
60
61注解
62: `LOCK TABLE ... IN ACCESS SHARE MODE`需要对目标表具有`SELECT`权限。所有其他形式的`LOCK`都需要表级`UPDATE`,`DELETE`或`TRUNCATE`权限。
63
64 `LOCK TABLE`在事务块之外是无用的:该锁定将仅在`LOCK`语句完成时就释放。因此,如果在事务块外部使用`LOCK`,PalopgMPP数据库将报告错误。使用`BEGIN`和`END`定义事务块。
65
66 `LOCK TABLE`仅处理表级锁,因此涉及`ROW`的模式名称都是错误的。 这些模式名称通常应理解为指示用户获取锁定表中的行级锁定的意图。另外,`ROW EXCLUSIVE`模式是可共享的表锁。 请记住,就`LOCK TABLE`而言,所有锁定模式都具有相同的语义,只是在哪些模式与哪个模式冲突的规则上有所不同。
67
68 有关如何获取实际的行级锁的信息,请参见`SELECT`参考文档中的`FOR UPDATE/FOR SHARE`子句。
69
70
71
72## 示例
73
74在执行`films_user_comments`表中的插入操作时,在`films`表上获得`SHARE`锁定:
75
76 ``` sql
77 BEGIN WORK;
78 LOCK TABLE films IN SHARE MODE;
79 SELECT id FROM films
80 WHERE name = 'Star Wars: Episode I - The Phantom Menace';
81 -- Do ROLLBACK if record was not returned
82 INSERT INTO films_user_comments VALUES
83 (_id_, 'GREAT! I was waiting for it for so long!');
84 COMMIT WORK;
85 ```
86
87 执行删除操作时,对表进行`SHARE ROW EXCLUSIVE`锁定:
88
89 ``` sql
90 BEGIN WORK;
91 LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
92 DELETE FROM films_user_comments WHERE id IN
93 (SELECT id FROM films WHERE rating < 5);
94 DELETE FROM films WHERE rating < 5;
95 COMMIT WORK;
96 ```
97
98
99
100兼容性说明
101: SQL标准中没有`LOCK TABLE`,而是使用`SET TRANSACTION`来指定事务的并发级别。PalopgMPP数据库也支持这一点。
102
103 除了`ACCESS SHARE`,`ACCESS EXCLUSIVE`和`SHARE UPDATE EXCLUSIVE`锁定模式外,PalopgMPP数据库锁定模式和`LOCK TABLE`语法与Oracle中的兼容。
104
105
106
107相关SQL命令
108: `BEGIN`, `SET TRANSACTION`, `SELECT`
评价此篇文章
