事务 1 事务 2 1 begin 2 delete from test where a = 2; 履行成功,事务 2 占领 a=2 下的 X 锁,类型为记录锁。 3 begin 4 【insert 第 1 阶段】insert into test (id, a) values (10, 2); 事务 2 申请 S 锁进行 duplicate key 进行检查。检查成功。 5 delete from test where a = 2; 事务 1 欲望申请 a=2 下的 X 锁,然则因为事务 2 已经申请了一把 X 锁,两把 X 锁互斥,所以 X 锁申请进入锁请求队列。 6 出现逝世锁,事务 1 权重较小,所以被选择回滚(成为就义品)。 【insert 第 2 阶段】insert into test (id, a) values (10, 2); 事务 2 开端插入数据,S 锁进级为 X 锁,类型为 insert intention。同理,X 锁进入队列列队,形成轮回等待,逝世锁产生。
背景
PS:本文不会介绍逝世锁的根本常识,mysql 的加锁道理可以参考本文的参考材料供给的链接。
逝世锁原由
先介绍一下数据库和神情况,因为涉及到公司内部真是的数据,所以以下都做了模仿,不会影响具体的分析。
我们采取的是 5.5 版本的 mysql 数据库,事务隔离级别是默认的 RR(Repeatable-Read),采取 innodb 引擎。假设存在 test 表:
- CREATE TABLE `test` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `a` int(11) unsigned DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `a` (`a`)
- ) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8;
表的构造很简单,一个主键 id,另一个独一索引 a。表里的数据如下:
推荐阅读
大年夜家之所以会去选择轻薄本,无疑是看中了便携这一特点,但这类标记本往往为了续航和散热等方面推敲,机能会有大年夜幅缩水,要想比较流畅地处理大年夜数据量的工作文件或玩游戏都是根本不太行的。 >>>详细阅读
本文标题:记一次MySQL死锁排查过程
地址:http://www.17bianji.com/lsqh/39935.html
1/2 1