LWLock
LWLock,轻量锁,主要用于*共享内存中的数据结构,以达到互斥访问的目的(避免并发造成的同一份数据被不同进程改写带来的不一致,即一段关键代码同时只允许一个进程进行改写)。
LWLock依赖SpinLock实现,有等待队列但没有死锁检测,能自动释放锁。所以适合使用在*时间较短的情况下。
本节从LWLock加锁的本质、LWLock实现的技术、LWLock加锁与释放锁、LWLock在PostgreSQL中的作用等多个角度,来探讨LWLock涉及的内容。
预定义的LWLock锁
预定义的LWLock锁有42个,具体如下:
#define ShmemIndexLock (&MainLWLockArray[1].lock)//共享内存锁
#define OidGenLock (&MainLWLockArray[2].lock)//生成Oid的值的锁
#define XidGenLock (&MainLWLockArray[3].lock)//生成Xid(事务号)的值的锁
#define ProcArrayLock(&MainLWLockArray[4].lock) //进程锁(PostgreSQL是多进程体系结构,用于进程间互斥)
#define SInvalReadLock (&MainLWLockArray[5].lock)//共享cache的读锁(SI: shared cacheinvalidation data manager)
#define SInvalWriteLock(&MainLWLockArray[6].lock) //共享cache的写锁
#define WALBufMappingLock(&MainLWLockArray[7].lock) //预先日志(WAL)缓存区锁,把数据写入缓存区
#define WALWriteLock (&MainLWLockArray[8].lock)//预先日志(WAL)写锁,把数据从缓存区刷出到持久化存储
#define ControlFileLock(&MainLWLockArray[9].lock) //控制文件锁
#define CheckpointLock(&MainLWLockArray[10].lock) //CheckPoint锁,用于创建CheckPoint
#define CLogControlLock(&MainLWLockArray[11].lock) //事务日志(CLog)锁
#define SubtransControlLock(&MainLWLockArray[12].lock) //子事务锁
#define MultiXactGenLock(&MainLWLockArray[13].lock) //多事务生成锁
#define MultiXactOffsetControlLock(&MainLWLockArray[14].lock) //多事务偏移控制锁
#define MultiXactMemberControlLock(&MainLWLockArray[15].lock) //多事务成员控制锁
#define RelCacheInitLock(&MainLWLockArray[16].lock) //RelationCache初始化锁
#define CheckpointerCommLock(&MainLWLockArray[17].lock) //CheckPoint常规锁,用于创建CheckPoint之外的CheckPoint操作
#define TwoPhaseStateLock(&MainLWLockArray[18].lock) //2阶段提交状态锁,用于分布式事务
#define TablespaceCreateLock(&MainLWLockArray[19].lock) //创建、删除表空间时以排他模式加的锁
#define BtreeVacuumLock(&MainLWLockArray[20].lock) //在BTree上执行Vacuum操作清理无用元组时加的锁
#define AddinShmemInitLock(&MainLWLockArray[21].lock) //共享内存初始化锁
#define AutovacuumLock (&MainLWLockArray[22].lock)//自动执行Vacuum的进程执行操作时的锁
#define AutovacuumScheduleLock(&MainLWLockArray[23].lock) //自动执行Vacuum的进程执行do_autovacuu()函数时的锁
#define SyncScanLock(&MainLWLockArray[24].lock) //在heap上进行扫描定位数据位置(BlockNumber)时的互斥锁
#define RelationMappingLock (&MainLWLockArray[25].lock)//RelationMapping锁( Catalog-to-filenode mapping)
#define AsyncCtlLock(&MainLWLockArray[26].lock) //异步控制锁(Asynchronousnotification: NOTIFY, LISTEN, UNLISTEN)
#define AsyncQueueLock(&MainLWLockArray[27].lock) //异步队列锁
#define SerializableXactHashLock(&MainLWLockArray[28].lock) //SSI(Serializable Snapshot Isolation)相关的锁
#define SerializableFinishedListLock(&MainLWLockArray[29].lock) //SSI相关的锁
#define SerializablePredicateLockListLock(&MainLWLockArray[30].lock) //SSI相关的锁
#define OldSerXidLock(&MainLWLockArray[31].lock) //SSI相关的锁
#define SyncRepLock(&MainLWLockArray[32].lock) //复制功能,同步复制相关锁
#define BackgroundWorkerLock(&MainLWLockArray[33].lock) //PostgreSQL 9.4支持backgroundworkers后台进程动态注册、启动、停止,是并行化的基础
#define DynamicSharedMemoryControlLock(&MainLWLockArray[34].lock) //动态共享内存控制锁
#define AutoFileLock(&MainLWLockArray[35].lock) //修改"postgresql.auto.conf"文件的操作锁
#define ReplicationSlotAllocationLock(&MainLWLockArray[36].lock) //复制功能,一个slot分配互斥锁
#define ReplicationSlotControlLock (&MainLWLockArray[37].lock)//复制功能,一个slot查找互斥锁
#define CommitTsControlLock(&MainLWLockArray[38].lock) //事务提交时间控制锁,与页面有关
#define CommitTsLock(&MainLWLockArray[39].lock) //事务提交时间锁,与上一个锁分别锁事务提交过程中不同的对象
#define ReplicationOriginLock(&MainLWLockArray[40].lock) //复制功能,复制相关锁
#define MultiXactTruncationLock(&MainLWLockArray[41].lock) //多事务Truncate锁
#define OldSnapshotTimeMapLock(&MainLWLockArray[42].lock) //老快照时间映射锁
PostgreSQL的文档中,在“wait_event Description”一节提供如下表格,对各种锁作了一个描述如表X-XX,可以和预定义的42个LWLock锁对应着互相理解。