锁定表。
语法
LOCK TABLE name [, ...] IN lockmode MODE [ NOWAIT ]
其中,lockmode
是以下项之一:
ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE
说明
LOCK TABLE
可获得表级别的锁定,必要时等待释放所有冲突的锁定。如果指定 NOWAIT
,则 LOCK TABLE
不会等待实现需要的锁定:如果不能立即获得锁定,该命令会被中止且报告错误。在获得锁定后,会在当前事务的剩余时间内保持锁定。(不存在 UNLOCK TABLE
命令;在事务结束时始终释放锁定。)
在为引用表的命令自动实现锁定时,PolarDB PostgreSQL版(兼容Oracle)始终使用限制最少的锁定模式。提供 LOCK TABLE
以用于您可能需要限制更多的锁定的情况。例如,假设应用程序在隔离级别 Read Committed 运行事务,并需要确保在事务期间表中的数据保持稳定。为实现该目的,可以在查询之前获得表的 SHARE
锁定模式。这样可防止并发数据更改,并确保后续读取表时会看到已提交数据的稳定视图,因为 SHARE
锁定模式与写入者获得的 ROWEXCLUSIVE
锁定冲突,而您的 LOCKTABLE
name IN SHARE MODE
语句将等待 ROW EXCLUSIVE
模式的所有并发持有者锁定提交或回滚。因此,一旦您获得锁定,将不存在未完成的未提交写入;另外,在您释放锁定之前,没有用户可以开始操作。
当在隔离级别 serializable 运行事务时,要实现相似效果,您必须先执行 LOCK TABLE
语句,然后再执行任何数据修改语句。在可串行化的事务的第一个数据修改语句开始时,该事务的数据视图会被冻结。稍后的 LOCK TABLE
将仍然禁止并发写入 - 但不确保事务读取的值与最新提交值对应。
如果此类事务要更改表中的数据,则它应使用 SHARE ROW EXCLUSIVE
锁定模式代替 SHARE
模式。
由此可确保一次仅运行一个此类事务。否则,可能会发生死锁:两个事务可能都获得 SHARE
模式,然后无法同时获取 ROWEXCLUSIVE
模式以真正执行它们的更新。(请注意,事务自身的锁定不会冲突,因此事务可在保持 SHARE
模式时获取 ROWEXCLUSIVE
模式,但如果其他用户保持 SHARE
模式,则无法获取。)为避免死锁,请确保所有事务按相同顺序获取对相同对象的锁定,而且如果单个对象涉及多个锁定模式,则事务应始终首先获取限制最多的模式。
参数
参数 | 名称 |
---|---|
name | 要锁定的现有表的名称(可能是 schema 限定的)。 命令 |
lockmode | 锁定模式会指定该锁定与哪些锁定冲突。 如果未指定锁定模式,则服务器使用限制最多的 |
NOWAIT | 指定 LOCKTABLE 不等待释放任何冲突的锁定:如果不能无需等待就立即获取指定的锁定,则事务中止。 |
注释
LOCK
的所有形式均需要 UPDATE
和/或 DELETE
特权。
LOCK TABLE
仅在事务块内有用,因为在事务结束后会立即删除锁定。在任何事务块以外显示的 LOCK TABLE
命令组成自包含的事务,所以会在获取锁定后立即将其删除。
LOCK TABLE
仅处理表级别的锁定,所以有关 ROW
的所有模式名称都不准确。通常,读取这些模式名称时应指示用户的意图,即在锁定表内获取行级别的锁定。另外,ROW EXCLUSIVE
模式是可共享的表锁定。请记住,所有锁定模式都具有与 LOCK TABLE
相关的相同含义,只是关于相互冲突的模式的规则有所不同。