事务机制源码解析| 锁机制(3)

5.3.3 常规锁

常规锁是使用哈希表实现的。常规锁支持多种锁模式(lock modes),这些锁模式之间的语义和冲突是通过冲突表来定义的。常规锁主要用于业务访问的数据库对象加锁。常规锁的加锁遵守数据库的两阶段加锁协议,即访问过程中加锁,事务提交时释放锁。
常规锁有等待队列并提供了死锁检测机制,当检测到死锁发生时选择一个事务进行回滚。

openGauss提供了8个锁级别分别用于不同的语句并发:1级锁一般用于SELECT查询操作;3级锁一般用于基本的INSERT、UPDATE、DELETE操作;4级锁用于VACUUM、analyze等操作;8级锁一般用于各类DDL语句,具体宏定义及命名代码如下:

#define RowShareLock 2 /* SELECT FOR UPDATE/FOR SHARE语句 */ #define RowExclusiveLock 3 /* INSERT, UPDATE, DELETE语句 */ #define ShareUpdateExclusiveLock 4 /* VACUUM (non-FULL),ANALYZE, CREATE INDEX CONCURRENTLY语句 */ #define ShareLock 5 /* CREATE INDEX (WITHOUT CONCURRENTLY)语句 */ #define ShareRowExclusiveLock 6 /* 类似于独占模式, 但是允许ROW SHARE模式并发 */ #define ExclusiveLock 7 /* 阻塞ROW SHARE,如SELECT...FOR UPDATE语句 */ #define AccessExclusiveLock 8 /* ALTER TABLE, DROP TABLE, VACUUM FULL, LOCK TABLE语句 */