了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站
引言
数据库系统有多种实现并发控制的机制,而锁作为其中一种实现方式,具有非常重要的作用。在这篇文章中,我们将介绍Greenplum中的锁管理机制是如何实现的。本周五(8月28日)的《深入浅出Greenplum内核》第六场活动中,来自Greenplum原厂的内核研发将深度揭秘MVCC并发控制的其他内容,尽请关注。
01 锁管理概述
在Greenplum实现中,针对不同的场景和目的定义了三种锁,分别是自旋锁(Spinlocks)、轻量级锁(LWLocks)和普通锁(Regular locks,也叫重量级锁)。
自旋锁是一种短期持有的锁。如果加锁之后程序指令很多,或者涉及到系统调用,则不适合使用自旋锁。自旋锁通常由硬件指令TAS来实现,等待锁的进程会忙等直到可以拿到锁,或是如果等待时间过长,会有超时机制。自旋锁没有死锁检测和出错时自动释放。
轻量级锁为共享内存中需要并发访问的结构体提供锁保护,支持两种模式:互斥模式和共享模式。轻量级锁并没有死锁检测机制,但是在elog出错恢复时,轻量级锁管理器会自动释放持有的轻量级锁,因此一个进程在持有轻量级锁时是可以安全地报错的。通常来说