作者:邵大明
邵大明
中国PG分会认证专家
PostgreSQL资深内核研发工程师
目录
1 概述
2 实现文件
3 数据结构
4 初始化
5 加锁
6 死锁检测
6.1 数据结构
6.2 初始化
6.3 工作原理
7 锁的释放
概述
RegularLock锁由LWLock实现,有两种锁方法DEFAULT_LOCKMETHOD,USER_LOCKMETHOD,不同锁方法生产不同锁表,八种锁模式。其特点是有等待队列,有死锁检测,能自动释放。
实现文件
Lock.c Lock.h
数据结构
锁模式
/* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */#define NoLock0#define AccessShareLock1/* SELECT */#define RowShareLock2/* SELECT FOR UPDATE/FOR SHARE */#define RowExclusiveLock3/* INSERT, UPDATE, DELETE */#define ShareUpdateExclusiveLock 4/* VACUUM (non-FULL),ANALYZE, CREATE INDEX CONCURRENTLY */#define ShareLock5/* CREATE INDEX (WITHOUT CONCURRENTLY) */#define ShareRowExclusiveLock6/* like EXCLUSIVE MODE, but allows ROW SHARE */#define ExclusiveLock7/* blocks ROW SHARE/SELECT...FOR UPDATE */#define AccessExclusiveLock8/* ALTER TABLE, DROP TABLE, VACUUM FULL, and unqualified LOCK TABLE */
LockConfilicMap.png typedef struct LockMethodData{
intnumLockModes;const LOCKMASK *conflictTab;const char *const * lockModeNames;const bool *trace_flag;} LockMethodData;typedef struct LOCKTAG{
uint32locktag_field1; /* a 32-bit ID field */uint32locktag_field2; /* a 32-bit ID field */uint32locktag_field3; /* a 32-bit ID field */uint16locktag_field4; /* a 16-bit ID field */uint8locktag_type;/* see enum LockTagType */uint8locktag_lockmethodid;/* lockmethod indicator */} LOCKTAG;typedef struct LOCK{
/* hash key */LOCKTAGtag;/* unique identifier of lockable object *//* data */LOCKMASKgrantMask;/* bitmask for lock types already granted */LOCKMASKwaitMask;/* bitmask for lock types awaited */ SHM_QUEUEprocLocks;/* list of PROCLOCK objects assoc. with lock */PROC_QUEUEwaitProcs;/* list of PGPROC objects waiting on lock */intrequested[MAX_LOCKMODES];/* counts of requested locks */intnRequested;/* total of requested[] array */intgranted[MAX_LOCKMODES]; /* counts of granted locks */intnGranted;/* total of granted[] array */} LOCK;typedef struct PROCLOCKTAG{
/* NB: we assume this struct contains no padding! */LOCK *myLock;/* link to per-lockable-object information */PGPROC *myProc;/* link to PGPROC of owning backend */} PROCLOCKTAG;typedef struct PROCLOCK{
/* tag */PROCLOCKTAG tag;/* unique identifier of proclock object *//* data */LOCKMASKholdMask;/* bitmask for lock types currently held */LOCKMASKreleaseMask;/* bitmask for lock types to be released */SHM_QUEUElockLink;/* list link in LOCK's list of proclocks */SHM_QUEUEprocLink;/* list link in PGPROC's list of proclocks */} PROCLOCK;typedef struct LOCALLOCKTAG{
LOCKTAGlock;/* identifies the lockable object */LOCKMODEmode;/* lock mode for this table entry */} LOCALLOCKTAG;typedef struct LOCALLOCKOWNER{
/* * Note: if owne