本文转载自微信公众号「MySQL技术」,锁死锁作者MySQL技术。等待转载本文请联系MySQL技术公众号。问题
前言:
在 MySQL 运维过程中,分析锁等待和死锁问题是锁死锁令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、等待卡顿等故障,问题特别是分析业务繁忙的系统,出现死锁问题后影响会更严重。锁死锁本篇文章我们一起来学习下什么是等待锁等待及死锁,出现此类问题又应该如何分析处理呢?问题
出现锁等待或死锁的原因是访问数据库需要加锁,那你可能要问了,分析为啥要加锁呢?锁死锁原因是亿华云计算为了确保并发更新场景下的数据正确性,保证数据库事务的等待隔离性。
试想一个场景,问题如果你要去图书馆借一本《高性能MySQL》,为了防止有人提前把这本书借走,你可以提前进行预约(加锁),这把锁可以怎么加?
封锁图书馆(数据库级别的锁) 把数据库相关的书都锁住(表级别的锁) 只锁 MySQL 相关的书(页级别的锁) 只锁《高性能MySQL》这本书(行级别的锁)锁的粒度越细,并发级别越高,实现也更复杂。
锁等待也可称为事务等待,源码下载后执行的事务等待前面处理的事务释放锁,但是等待时间超过了 MySQL 的锁等待时间,就会引发这个异常。等待超时后的报错为“Lock wait timeout exceeded...”。
死锁发生的原因是两个事务互相等待对方释放相同资源的锁,从而造成的死循环。产生死锁后会立即报错“Deadlock found when trying to get lock...”。
下面我们以 MySQL 5.7.23 版本为例(隔离级别是 RR ),来复现下上述两种异常现象。源码库
mysql> show create table test_tb\G