数据库遇到了死锁,你该如何排查?
背景前段时间做了很多慢SQL的优化工作,这周刚好又被反馈服务出现了死锁导致了业务报错。看了一下云数据库的告警日志,发现出现了比较多的事务未提交、死锁、等待行锁的严重警告。都是一些棘手的运维工作,涉及到业务流程的梳理、SQL的优化等工作。
今天趁这个机会,我们一起看下如何去分析这些问题,主要看下等待行锁、死锁。
数据库有哪几种锁?每次说数据库锁,感觉一大堆。其实如果按照一定的纬度去整理下,还是比较清晰的。如图:
力度划分:表锁、页锁、行锁
算法划分:Record Lock、Gap Lock、Next-key Lock
实现机制:乐观锁、悲观锁
兼容性:排它锁、共享锁、意向锁
每次说锁,其实也要跟它的隔离级别挂钩才行,其实都是为了去实现某一个功能才产生的。所以不可以一概而论,总之记住几个大的背景:
不同的隔离级别才会有不同的锁,比如RR才会出现Gap Lock,因为要避免幻读的问题,所有要把它相邻的数据也要锁住。
锁是作用在索引上的,包含:聚簇索引、非聚簇索引
如何看日志?1234SET GLOBAL innodb_status_output=ON; -- 开启输出SET GLOBA
...