写博客主要是记录一下自己处理的事情的一个复盘,梳理问题分析过程和理清处理问题中涉及的数据库原理、概念,如果文章有错误请评论指出,多多指教。
参考博客:https://www.modb.pro/db/70021
锁的分类
kingbase数据库是在pg数据库的内核基础之上做的开发和兼容,postgresql锁相关的也适应kingbase。kingbase有哪些锁呢?事务锁、表锁、行锁。由于mvcc机制kingbase数据库的事务概念会经常在分析问题时涉及到。表锁和行锁概念同oracle和mysql。
锁的类型
事务锁的类型有,SharedLock 和ExeclusiveLock。
表锁,经典的锁矩阵, 8类主要的锁类型,ACCESS SHARE和ACCESS EXCLUSIVE可以理解为多版本读/写,SELECT会在查询的表上获取ACCESS SHARE,而那些很硬的操作,诸如TRUNCATE、DROP TABLE等都会获取ACCESS EXCLUSIVE。
ROW SHARE和ROW EXCLUSIVE可以理解为意向读/写锁,意向锁根据名字,就是意向做一件事,但并非实际执行,所以可以看到ROW SHARE和ROW EXCLUSIVE之间互不冲突。当要更新插入时,需要先在对应的表上获取ROW EXCLUSIVE锁。
SHARE和EXCLUSIVE为传统的读写锁,在PostgreSQL中有点变化,EXCLUSIVE锁出现频率很低,SHARE锁用在了创建索引的时候,因为SHARE锁不自斥,所以也就意味着在一张表上可以同时创建多个索引,但是会堵塞插入更新等(和ROW EXCLUSIVE冲突)。
而SHARE UPDATE EXCLUSIVE和SHARE ROW EXCLUSIVE两种锁比较难记忆,SHARE UPDATE EXCLUSIVE在VACUUM和ALTER TABLE SET(XXX)等操作时会获取,因为SHARE UPDATE EXCLUSIVE是自斥的,所以目前PostgreSQL无法做到表级的并行VACUUM,但可以做到库级的并行VACUUM(好消息是,在刚刚发布不久的POSTGRESQL13中,对索引的清理支持并行了);SHARE ROW EXCLUSIVE出现的概率较低,一般常见的是创建触发器
![kingbase锁矩阵](https://img-blog.csdnimg.cn/direct/4412f3c79ec243e3a128d89183e86cb0.png
死锁
死锁在各大主流数据库中都有,当一个事务试图获取另一个事务已在使用的资源,而第二个事务又试图获取第一个事务在使用的资源时,就会发生死锁,在kingbase中,有lock_timeout、deadlock_timeout、log_lock_waits(日志记录)等参数控制。死锁检测是一件十分耗费资源的事情,大多数时候,一旦检测到死锁,则其中一个事务(大多数情况下是发起检查的事务)将被迫中止。
锁等待
在 kingbase 中,当事务请求获取锁而无法立即获得时,就会发生锁等待。例如,如果一个事务持有行或表的排他锁(ExclusiveLock),而另一个事务尝试在同一资源上获取共享锁(ShareLock)或也尝试获取排他锁,那么第二个事务将必须等待第一个事务释放锁。