Spinlocks(自旋锁):
短期锁,一般不直接用。如果硬件中有TAS(test and set)指令集,则用硬件实现,否则用信号量实现。
__asm__ __volatile__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分)
Lightweight locks (轻量级锁,LWLocks):
中期,用于锁 struct 结构体,无死锁检测,能自动释放。获取锁时用mutex来锁定锁队列,不成功则入等待队列。在事务出错恢复时会自动释放。
Regular locks (重量级锁):
有default 与 user 两种模式,user模式适用于长事务,没有等待队列。
row 行级别。access 表级别。
select for update/share 时会锁定行(共享锁)(悲观锁),提交事务后才被释放。
create index 时用共享锁加锁
vacuum 时会加共享更新排他锁。
加锁与解锁过程:
死锁分两种:
-
hard:要请求的锁与其它进程已有锁冲突
-
soft:自己申请的锁和其它进程申请的锁冲突,但自己在它后面
soft 可利用拓扑排序清除,原理见 https://www.cnblogs.com/bigsai/p/11489260.html