约束强制执行和锁定
对于需要验证启用的主键和唯一约束的 DML 操作,Vertica 使用插入/验证 (IV) 锁。
在强制执行主键或唯一键约束的表上运行此类操作时,Vertica 将按以下方式对表设置锁:
-
设置 I(插入)锁以加载数据。多个会话可以同时获取同一张表的 I 锁,并同时加载数据。
-
设置表的 IV 锁,可针对表的主约束和唯一约束验证加载的数据。一次只有一个会话可以获取给定表的 IV 锁。其他需要访问该表的会话将被阻止,直到 IV 锁释放为止。 会话将保留其 IV 锁,直到出现以下两个事件之一:
-
验证已完成且已提交 DML 操作。
-
检测到约束违规且已回滚操作。
在上述任一情况下,Vertica 均会释放 IV 锁。
-
阻止锁定 IV
Vertica 验证表的主键或唯一键约束时,将暂时阻止对表执行其他 DML 操作。当多个会话同时尝试对同一个表上的数据进行大量更改时,此类延迟可能会特别明显。
例如,在三个并发会话中,每个会话均尝试将数据加载到表 t1
中,如下所示:
-
所有三个会话均获取
t1
的 I 锁,并开始将数据加载到表中。 -
会话 2 获取
t1
的排他 IV 锁,以验证其加载数据的表约束。一次只有一个会话可以获取表的 IV 锁,因此会话 1 和 3 必须等待会话 2 完成验证,然后才能开始自己的验证。 -
会话 2 成功验证它加载到
t1
中的所有数据。提交其加载事务之后,它将释放表的 IV 锁。 -
会话 1 获取
t1
的 IV 锁,并开始验证其加载的数据。在此示例中,Vertica 检测到违反约束并回滚加载事务。会话 1 释放其t1
IV 锁。 -
现在,会话 3 获取
t1
的 IV 锁,并开始验证其加载的数据。完成验证后,会话 3 提交其加载事务,并释放t1
的 IV 锁。该表现在可用于其他 DML 操作。
另请参阅
有关锁定架构和兼容性以及转换矩阵的信息,请参阅 锁定模式。另请参阅 LOCKS 和 LOCK_USAGE。