数据库并发事务控制四:postgresql数据库的锁机制

本文详细介绍了PostgreSQL数据库中的轻量级锁(LWLocks),包括其数量分配、不同模块的需求以及加锁对象的标识。通过分析`NumLWLocks()`函数,揭示了LWLocks在系统中的使用情况,涉及到缓冲区管理、进程控制、事务日志等多个核心组件。后续将探讨更多关于并发事务控制的内容。
摘要由CSDN通过智能技术生成
并发控制是DBMS的关键技术,并发控制技术也称为同步机制,其实现通常依赖于底层的并发控制机制。操作系统提供了多种同步对象,如事件 Event、互斥锁 Mutex和条件变量 Cond、信号量Semaphore、读写锁 RWLock、自旋锁 Spinlock等。数据库管理系统自己实现封锁主要是考虑:
    锁语义加强:OS只提供排它锁。为了提高并发度,数据库至少需要共享锁和排它锁,即读锁和写锁;
    锁的功能增强:数据库提供视图监测封锁情况和进行死锁检测;
    可靠性的考虑:例如,在某个持锁进程任意一点回滚时,数据库系统要能够释放其占有的锁;
    可移植性的考虑:各个平台的封锁并没有完全对等的一一匹配;
    效率的考虑;例如使用spinlock来提高在SMP处理机上的性能;
但是最终,数据库系统都是依靠操作系统和硬件平台提供的同步机制来实现自己的封锁。pg中提供了自旋锁、轻量锁以及常规锁。自旋锁和轻量锁都是pg内部使用的。常规锁pg内部使用,用户也可以通过select * for update等指定锁。
先把pg系统内核里锁相关的关键结构和变量吧。

自旋锁:
用于锁锁或其它内存结构,对用户透明,不支持死锁检测。
pg中实现自旋锁的几个相关文件是spin.h, spin.c, s_lock.h, s_lock.c。
  spin.h 定义了自旋锁的接口函数/宏。
  spin.c 定义了一个利用信号量实现的自旋锁,如果目标平台没有自己的自旋锁就用这个。
  s_lock.h 定义了硬件、操作系统平台相关的自旋锁的实现。
自旋锁在少数几个地方被直接使用,它主要是作为实现轻量锁的一个手段。每个LWLOCK都需要有一个自旋锁。

轻量锁:
轻量锁有读锁(LW_SHARED)和写锁(LW_EXCLUSIVE),对用户透明,不支持死锁检测,用于锁内存结构,保持临界区进程间互斥,共享内存中分配控制结构的空间。

主要接口函数在 lwlock.h 文件中定义。下面是域定义的轻量锁。
/*
 * We have a number of predefined LWLocks, plus a bunch of LWLocks that are
 * dynamically assigned (e.g., for shared buffers).  The LWLock structures
 * live in shared memory (since they contain shared data) and are identified
 * by values of this enumerated type.  We abuse the notion of an enum somewhat
 * by allowing values not listed in the enum declaration to be assigned.
 * The extra value MaxDynamicLWLock is there to keep the compiler from
 * deciding that the enum can be represented as char or short ...
 *
 * If you remove a lock, please replace it with a placeholder. This retains
 * the lock numbering, which is helpful for DTrace and other external
 * debugging scripts.
 */
typedef enum LWLockId
{
    BufFreelistLock,
    ShmemIndexLock,
    OidGenLock,
    XidGenLock,
    ProcArrayLock,
    SInvalReadLock,
    SInvalWriteLock,
    WALInsertLock,
    WALWriteLock,
    ControlFileLock,
    CheckpointLock,
    CLogControlLock,
    SubtransControlLock,
    MultiXactGenLock,
    MultiXactOffsetControlLock,
    MultiXactMemberControlLock,
    RelCacheInitLock,
    Ch
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值