全局hash LockMethodLockHash:存储LOCK LockMethodProcLockHash:存储PROCLOCK LockMethodLocalHash:存储LOCALLOCK
同一个LOCK资源对象可以被多个不同的 PROCLOCK 持有,而这些 PROCLOCK 又分别属于不同的进程。
LOCKTAG 1 2 3 4 5 6 7 8 9 typedef struct LOCKTAG { uint32 locktag_field1; uint32 locktag_field2; uint32 locktag_field3; uint16 locktag_field4; uint8 locktag_type; uint8 locktag_lockmethodid; } LOCKTAG;
locktag_type 标识这个锁是针对哪类资源的。每种 LockTagType 决定了 LOCKTAG 里后面几个字段(locktag_field1 ~ locktag_field4)是怎么解释的,比如: LOCKTAG_TRANSACTION:xid LOCKTAG_RELATION:dbOid + relOid LOCKTAG_TUPLE:dbOid + relOid + blockNum + offNum
locktag_lockmethodid
DEFAULT_LOCKMETHOD(id = DEFAULT_LOCKMETHOD) 绝大多数用户可见的锁(relation, tuple, transactionid 等)都走它。
USER_LOCKMETHOD(id = USER_LOCKMETHOD) 提供给 pg_advisory_lock() 一类的 advisory lock,用于用户自定义锁。
LOCK 1 2 3 4 5 6 7 8 9 10 11 12 typedef struct LOCK { LOCKTAG tag; LOCKMASK grantMask; LOCKMASK waitMask; dlist_head procLocks; dclist_head waitProcs; int requested[MAX_LOCKMODES]; int nRequested; int granted[MAX_LOCKMODES]; int nGranted; } LOCK;
waitProcs 等待本LOCK的PGPROC链表
procLocks 等待本LOCK的PROCLOCK链表
waitMask 该资源上等待的锁类型
grantMask 该资源上已经授予的锁类型
LOCKMODE 每种资源支持8种锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #define NoLock 0 #define AccessShareLock 1 #define RowShareLock 2 #define RowExclusiveLock 3 #define ShareUpdateExclusiveLock 4 #define ShareLock 5 #define ShareRowExclusiveLock 6 #define ExclusiveLock 7 #define AccessExclusiveLock 8 #define MaxLockMode 8
冲突矩阵
Requested Lock Mode
ACCESS SHARE
ROW SHARE
ROW EXCL.
SHARE UPDATE EXCL.
SHARE
SHARE ROW EXCL.
EXCL.
ACCESS EXCL.
ACCESS SHARE
X
ROW SHARE
X
X
ROW EXCL.
X
X
X
X
SHARE UPDATE EXCL.
X
X
X
X
X
SHARE
X
X
X
X
X
SHARE ROW EXCL.
X
X
X
X
X
X
EXCL.
X
X
X
X
X
X
X
ACCESS EXCL.
X
X
X
X
X
X
X
X
参考链接 postgres官方文档