postgresql select for update 多行加锁顺序_PostgreSQL源码学习之:RegularLock

作者:邵大明 23d529fa32ab8adc5b01a8ebd7f4a0ae.png 邵大明 中国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 */

391b011daeca8201851d0d8bc3699cd0.png

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值