这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
Vertica 数据库锁
当多个用户并发访问同一数据库信息时,数据处理可能会导致冲突并破坏数据完整性。发生这些冲突的原因是,某些事务会在事务完成前阻止其他操作。由于同时提交的事务应产生一致的结果,因此,Vertica 使用各种锁来维持数据并发性和一致性。Vertica 会根据对象状态,通过限制用户可对该对象执行的操作来自动控制锁定情况。
Vertica 使用对象锁和系统锁。对象锁用于对象,如表和投影。系统锁包括全局编录锁、本地编录锁和弹性群集锁。Vertica 支持全系列的标准 SQL 锁定模式,例如共享 (S) 和独占 (X)。
有关不同事务隔离级别中锁使用情况的相关信息,请参阅 READ COMMITTED 隔离和 SERIALIZABLE 隔离。
1 - 锁定模式
Vertica 具有不同的锁定模式,这些锁定模式决定了锁在对象上如何发挥作用。每个锁定模式都具有一种锁定兼容性和锁定强度,反映了它在同一个环境中如何与其他锁交互。
锁兼容性
锁兼容性是指两个锁能在同一个对象上同时生效。
锁兼容性一览表
此一览表显示了哪些锁可在同一个对象上同时使用。
当锁定模式在标有项目符号 (•) 的单元格中相交时,它们兼容。如果请求的两个模式在空单元格相交,那么在第一个请求释放锁之前,不会向第二个模式授予锁。
锁升级一览表
此一览表显示了对象锁如何响应 INSERT 请求。
如果对象具有一个 S 锁,而您希望执行 INSERT,您的事务将请求 SI 锁。但是,如果某个对象具有 S 锁,而您希望执行要求 S 锁的操作,则不会发出锁定请求。
锁强度
锁强度是指一个锁定模式与另一个锁定模式交互的能力。O 锁是最强的锁,并且与所有其他锁不兼容。相反,U 锁是最弱的锁,可以与除 O 锁之外的所有其他锁同时运行。
下图描述了锁定模式的强度:
另请参阅:
2 - 锁定示例
在此示例中,两个会话 A 和 B 处于活动状态,并尝试处理表 T1。在示例开始时,表 T1 具有一列 (C1),但没有任何行。
这里的步骤说明的是从会话 A 和会话 B 可执行的一系列事务:
-
两个会话中的事务都获取了 S 锁,以便从表 T1 进行读取。
-
会话 B 释放了其针对 COMMIT 语句的 S 锁定。
-
会话 A 可升级到 SI 锁并插入到 T1,因为会话 B 释放了其 S 锁。
-
执行 COMMIT 语句后,会话 A 释放了其 SI 锁。
-
两个会话都可以获取 S 锁,因为会话 A 释放了其 SI 锁。
-
会话 A 无法获取 SI 锁,因为会话 B 未释放其 S 锁。SI 锁与 S 锁不兼容。
-
会话 B 释放了其针对 COMMIT 语句的 S 锁定。
-
会话 A 现在可以升级到 SI 锁并插入 T1。
-
会话 B 会尝试从 T1 删除一个行,但无法获取 X 锁,因为会话 A 未释放其 SI 锁。SI 锁与 X 锁不兼容。
-
会话 A 继续向 T1 插入内容。
-
会话 A 释放其 SI 锁。
-
会话 B 现在可以获取 X 锁并执行删除操作。
此图说明了前述步骤:
另请参阅:
Vertica 数据库锁
锁定模式
3 - 对锁定进行故障排除
LOCKS 和 LOCK_USAGE 系统表有助于排查在使用 Vertica 数据库锁期间遇到的问题。
此示例显示了来自 LOCKS 系统表的一行。在此表中,您可以看到哪些类型的锁正在特定对象和节点上处于活动状态。
=> SELECT node_names, object_name, lock_mode, lock_scope FROM LOCKS;
node_names | object_name | lock_mode | lock_scope
-------------------+---------------------------------+-----------+-----------
v_vmart_node0001 | Table:public.customer_dimension | X | TRANSACTION
此示例显示了来自 LOCKS_USAGE 系统表的两行。您也可使用此表查看哪些锁正在特定对象和节点上使用。
=> SELECT node_name, object_name, mode FROM LOCK_USAGE;
node_name | object_name | mode
------------------+------------------+-------
v_vmart_node0001 | Cluster Topology | S
v_vmart_node0001 | Global Catalog | X