副问题[/!--empirenews.page--]
数据库死锁,是最难调试与追踪的。
场景如下:
统一个表,事宜内先插入一笔记录,再更新这笔记录,并发时会死锁。
而且可以或许复现。
可以通过什么器材模仿并发事宜,查察信息,办理题目呢?这是本日要分享的内容。
一、前置筹备
- set session transaction isolation level repeatable read;
- set session autocommit=0;
-
- create table t (
- id int(20) primary key AUTO_INCREMENT,
- cell varchar(20) unique
- )engine=innodb;
-
- start transaction;
- insert into t(cell) values(11111111111);
- insert into t(cell) values(22222222222);
- insert into t(cell) values(33333333333);
- commit;
声名:
- 案发时,事宜断绝级别RR;
- 多终端尝试,必要封锁事宜自动提交;
- 建表,配置PK与unique,初始化数据;
二、并发事宜模仿
- Session A:
- start transaction;
- insert into t(cell)values(44444444444); [1]
- Session B:
- start transaction;
- insert into t(cell) values(55555555555); [2]
- update t set cell=123 where cell=44444444444; [3]
- update t set cell=456 where cell=55555555555; [4]
开启两个终端模仿并发事宜:
- 赤色SQL为事宜A;
- 玄色SQL为事宜B;
- [1][2][3][4]为执行时序;
三、尝试征象
- insert into t(cell)values(44444444444); [1]
事宜A插入数据,最先执行
功效:插入乐成
- insert into t(cell) values(55555555555); [2]
事宜B插入数据,第二执行
功效:插入成就
- update t set cell=123 where cell=44444444444; [3]
事宜A修改[1]中插入的数据,第三执行
功效:阻塞,守候执行功效
画外音:修改一条本身插入的数据,在守候什么呢?
- update t set cell=456 where cell=55555555555; [4]
事宜B修改[2]中插入的数据,最后执行
功效:
- 事宜B死锁,事宜B被回滚;
- 事宜A中,[3]语句阻塞竣事,执行乐成;
画外音:声名事宜A中阻塞的语句,确其实等事宜B中的某个锁。
四、功效说明
两个事宜,各自修改本身插入的数据,却发生了死锁,确实诡异。
上述尝试征象的两个焦点题目是:
- 语句[3]阻塞,在守候什么锁?
- 语句[4]死锁,此事势务A和事宜B必然是互相占住一把锁,哀求互相的锁,这些锁又是什么呢?
器材一:
- show engine innodb status;
执行之后,表现的内容如下(放大细心看):
信息许多,别急,楼主娓娓道来。
第一部门,要害词是:
- Transaction 1,事宜3998;
- 在执行
- update t set cell=123 where cell=44444444444;
正在守候锁开释(waiting for this lock to be granted),记录锁(record locks),主键索引上(index primary),互斥锁(lock_mode X),物理记录(physical record),asc 55555555555;
画外音:英文较量差没事,抓要害词。
画外音,InnoDB存储引擎,聚积索引与非聚积索引的实现方法,抉择了锁会加在聚积索引上,详见文章:
《1分钟相识MyISAM与InnoDB的索引差别》。
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|