约束强制执行和锁定

对于需要验证启用的主键和唯一约束的 DML 操作,Vertica 使用插入/验证 (IV) 锁。

在强制执行主键或唯一键约束的表上运行此类操作时,Vertica 将按以下方式对表设置锁:

  1. 设置 I(插入)锁以加载数据。多个会话可以同时获取同一张表的 I 锁,并同时加载数据。

  2. 设置表的 IV 锁,可针对表的主约束和唯一约束验证加载的数据。一次只有一个会话可以获取给定表的 IV 锁。其他需要访问该表的会话将被阻止,直到 IV 锁释放为止。 会话将保留其 IV 锁,直到出现以下两个事件之一:

    • 验证已完成且已提交 DML 操作。

    • 检测到约束违规且已回滚操作。

    在上述任一情况下,Vertica 均会释放 IV 锁。

阻止锁定 IV

Vertica 验证表的主键或唯一键约束时,将暂时阻止对表执行其他 DML 操作。当多个会话同时尝试对同一个表上的数据进行大量更改时,此类延迟可能会特别明显。

例如,在三个并发会话中,每个会话均尝试将数据加载到表 t1 中,如下所示:

  1. 所有三个会话均获取 t1 的 I 锁,并开始将数据加载到表中。

  2. 会话 2 获取 t1 的排他 IV 锁,以验证其加载数据的表约束。一次只有一个会话可以获取表的 IV 锁,因此会话 1 和 3 必须等待会话 2 完成验证,然后才能开始自己的验证。

  3. 会话 2 成功验证它加载到 t1 中的所有数据。提交其加载事务之后,它将释放表的 IV 锁。

  4. 会话 1 获取 t1 的 IV 锁,并开始验证其加载的数据。在此示例中,Vertica 检测到违反约束并回滚加载事务。会话 1 释放其 t1 IV 锁。

  5. 现在,会话 3 获取 t1 的 IV 锁,并开始验证其加载的数据。完成验证后,会话 3 提交其加载事务,并释放 t1 的 IV 锁。该表现在可用于其他 DML 操作。

另请参阅

有关锁定架构和兼容性以及转换矩阵的信息,请参阅 锁定模式。另请参阅 LOCKSLOCK_USAGE