VastbaseE100

基于开源技术的HTAP数据库管理系统。性能优异,稳定可靠,提供诸多专属领域特性。

Menu

LOCK

LOCK - 锁定一个表

语法格式

LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ]

其中 lockmode 可以是以下之一:

    ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
    | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

说明

LOCK TABLE 获取表级锁,如有必要则等待释放任何冲突锁。如果指定 NOWAIT,则 LOCK TABLE不等待获取所需的锁:如果无法立即获取,则命令将中止并发出错误。一旦获得,锁定将保留当前事务的剩余部分。(没有 UNLOCK TABLE 命令;锁总是在事务结束时释放。)

当视图被锁定时,视图定义查询中出现的所有关系也会以相同的锁定模式递归锁定。

当为引用表的命令自动获取锁时,Vastbase E100总是使用限制性最小的锁模式。LOCK TABLE 提供了可能需要更严格锁定的情况。例如,假设应用程序在 READ COMMITTED隔离级别运行事务,并且需要确保表中的数据在事务持续期间保持稳定。要实现此目的,您可以在查询之前获取表上的SHARE锁定模式。这将防止并发数据更改并确保后续读取表查看已提交数据的稳定视图,因为SHARE 锁定模式与编写器获取的 ROW EXCLUSIVE 锁冲突,并且 LOCK TABLE name IN SHARE MODE 语句将等待 ROW EXCLUSIVE模式的任何并发持有者锁定提交或回滚。因此,一旦获得锁定,就没有未提交的未写入的写入;此外,在释放锁之前,没有人可以始。

要在 REPEATABLE READ 或 SERIALIZABLE隔离级别运行事务时实现类似的效果,必须在执行任何 SELECT或数据修改语句之前执行 LOCK TABLE 语句。 REPEATABLE READ 或 SERIALIZABLE事务的数据视图将在其第一个 SELECT 或数据修改语句开始时被冻结。事务中的LOCK TABLE 稍后仍将阻止并发写入 -但它不会确保事务读取的内容与最新提交的值相对应。

如果此类事务要更改表中的数据,则应使用 SHARE ROW EXCLUSIVE锁定模式而不是 SHARE模式。这可确保一次只运行此类型的一个事务。如果没有这个,就可能出现死锁:两个事务可能都获得了SHARE 模式,然后无法获取 ROW EXCLUSIVE 模式来实际执行更新。(请注意,事务自身的锁永远不会发生冲突,因此事务在保持 SHARE模式时可以获取 ROW EXCLUSIVE 模式 - 但如果其他人持有 SHARE模式则不会。)为了避免死锁,请确保所有事务都获取相同对象的锁定如果单个对象涉及多个锁定模式,则事务应始终首先获取最严格的模式。

参数说明

  • name

    要锁定的现有表的名称(可选择模式限定)。如果在表名之前指定了 ONLY,则仅锁定该表。如果未指定 ONLY ,则表及其所有后代表(如果有)将被锁定。(可选)可以在表名后指定 * 以明确指示包含后代表。

    命令 LOCK TABLE a, b; 等同于 LOCK TABLE a; LOCK TABLE b; 。这些表按 LOCKTABLE 命令中指定的顺序逐个锁定。

  • lockmode

    锁定模式指定此锁与哪些锁冲突。

    如果未指定锁定模式,则使用最严格模式 ACCESS EXCLUSIVE 。

  • NOWAIT

    指定 LOCK TABLE不应等待释放任何冲突的锁:如果在不等待的情况下无法立即获取指定的锁,则中止事务。

注意事项

LOCK TABLE … IN ACCESS SHARE MODE 在目标表上需要 SELECT 权限。 LOCK TABLE … IN ROW EXCLUSIVE MODE 在目标表上需要 INSERT , UPDATE ,DELETE 或 TRUNCATE 权限。所有其他形式的 LOCK 都需要表级 UPDATE , DELETE或 TRUNCATE 权限。

在视图上执行锁定的用户必须在视图上具有相应的权限。此外,视图的所有者必须具有底层基本关系的相关权限,但执行锁定的用户不需要对底层基本关系的任何权限。

LOCK TABLE在事务块之外是无用的:锁只保留在语句完成之后。因此,如果在事务块之外使用LOCK ,Vastbase E100会报告错误。使用 BEGIN和 COMMIT(或ROLLBACK)定义事务块。

LOCK TABLE 仅处理表级锁,因此涉及 ROW的模式名称都是误称。通常应将这些模式名称读取为指示用户获取锁定表中的行级锁定的意图。此外,ROW EXCLUSIVE 模式是可共享的表锁。请记住,就 LOCK TABLE而言,所有锁定模式都具有相同的语义,仅在有关哪些模式与哪些模式冲突的规则上有所不同。有关如何获取实际行级锁定的信息,请参阅SELECT 参考文档中的 The Locking Clause。

示例

在要对外键表执行插入时,在主键表上获取 SHARE 锁:

BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films
    WHERE name = 'Star Wars: Episode I - The Phantom Menace';
-- 如果记录没有被返回就做 ROLLBACK
INSERT INTO films_user_comments VALUES
    (_id_, 'GREAT! I was waiting for it for so long!');
COMMIT WORK;

在执行删除操作时,在主键表上执行 SHARE ROW EXCLUSIVE 锁定:

BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM films_user_comments WHERE id IN
    (SELECT id FROM films WHERE rating < 5);
DELETE FROM films WHERE rating < 5;
COMMIT WORK;

兼容性

SQL标准中没有 LOCK TABLE ,而是使用 SET TRANSACTION来指定事务的并发级别。 Vastbase E100也支持它;有关详细信息,请参阅 SET TRANSACTION。

除了 ACCESS SHARE , ACCESS EXCLUSIVE 和 SHARE UPDATE EXCLUSIVE锁定模式之外,Vastbase E100锁定模式和 LOCK TABLE 语法与Oracle中的语法兼容。