锁定表。

语法

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 限定的)。

命令 LOCKTABLE a, b; 等同于 LOCK TABLE a; LOCK TABLE b。表会按照在 LOCK TABLE 命令中指定的顺序依次锁定。

lockmode锁定模式会指定该锁定与哪些锁定冲突。

如果未指定锁定模式,则服务器使用限制最多的 ACCESS EXCLUSIVE 模式。(ACCESS EXCLUSIVE 与 Oracle 数据库不兼容。在PolarDB PostgreSQL版(兼容Oracle)中,该配置模式确保其他事务不可对锁定的表进行任何形式的访问。)

NOWAIT指定 LOCKTABLE 不等待释放任何冲突的锁定:如果不能无需等待就立即获取指定的锁定,则事务中止。

注释

LOCK 的所有形式均需要 UPDATE 和/或 DELETE 特权。

LOCK TABLE 仅在事务块内有用,因为在事务结束后会立即删除锁定。在任何事务块以外显示的 LOCK TABLE 命令组成自包含的事务,所以会在获取锁定后立即将其删除。

LOCK TABLE 仅处理表级别的锁定,所以有关 ROW 的所有模式名称都不准确。通常,读取这些模式名称时应指示用户的意图,即在锁定表内获取行级别的锁定。另外,ROW EXCLUSIVE 模式是可共享的表锁定。请记住,所有锁定模式都具有与 LOCK TABLE 相关的相同含义,只是关于相互冲突的模式的规则有所不同。