事务中的并发控制
本文档介绍 Apache Cloudberry 中的事务并发控制,包括:
多版本并发控制机制
Apache Cloudberry 和 PostgreSQL 不使用锁机制来进行事务并发控制,而是使用多版本并发控制(MVCC)机制来维护数据一致性。MVCC 确保每个数据库会话的事务隔离,使得每个查询事务都能看到一个一致的数据快照。这保证了事务观察到的数据是一致的,不受其他并发事务的影响。
然而,事务可见的具体数据变化受隔离级别的影响。默认的隔离级别是“已提交读”(READ COMMITTED
),这意味着事务可以观察到其他已提交事务所做的数据变化。如果将隔离级别设置为“可重复读”(REPEATABLE READ
),那么该事务中的查询将观察到事务开始时的数据状态,并且不会看到其他事务在此期间所做的更改。为了指定事务的隔离级别,你可以使用语句 BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ
来以“可重复读”隔离级别启动事务。
由于 MVCC 不使用显式锁进行并发控制,因此最大限度减少了锁争用,Apache Cloudberry 在多用户环境中保持了合理的性能。用于查询(读取)数据的锁不会与用于写 入数据的锁发生冲突。
锁模式
Apache Cloudberry 提供多种锁模式来控制对表数据的并发访问。大多数 Apache Cloudberry 的 SQL 命令会自动获取适当的锁,以确保在命令执行期间,被引用的表不会被删除或被以不兼容的方式修改。对于那些难以适应 MVCC 行为的应用程序,你可以使用 LOCK
命令来获取显式锁。然而,通常情况下,正确使用 MVCC 能够提供更好的性能。
锁模式 | 相关 SQL 命令 | 与之冲突的其他锁模式 |
---|---|---|
ACCESS SHARE | SELECT | ACCESS EXCLUSIVE |
ROW SHARE | SELECT...FOR lock_strength | EXCLUSIVE, ACCESS EXCLUSIVE |
ROW EXCLUSIVE | INSERT , COPY | SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE UPDATE EXCLUSIVE | ANALYZE | SHARE UPDATE EXCLUSIVE, SHARE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE | CREATE INDEX | ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
SHARE ROW EXCLUSIVE | ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE | |
EXCLUSIVE | DELETE , UPDATE , SELECT...FOR lock_strength , REFRESH MATERIALIZED VIEW CONCURRENTLY | ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE |
ACCESS EXCLUSIVE | ALTER TABLE , DROP TABLE , TRUNCATE , REINDEX , CLUSTER , REFRESH MATERIALIZED VIEW |