mysql中删除同一行会经常出现死锁?太可怕了
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`abc` varchar(30),
`def` varchar(30) ,
`ghi` date,
`jkl` date,
`mnp` tinyint(4),
PRIMARY KEY (`id`),
UNIQUE KEY `uniqdefghijkl` (`def`,`ghi`,`jkl`)
);
------------------------
140123 12:20:50
*** (1) TRANSACTION:
TRANSACTION 2E10, ACTIVE 4917 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 3, OS thread handle 0x1008, query id 43 192.168.xx.x username upd
ating
delete from abcdefg WHERE abc= '我是变量' and def= '我是变量' and ghi= '2013-12-19 00:00:00' and jkl= '2013-12-20 00:00:00';
RECORD LOCKS space id 0 page no 12295 n bits 528 index `uniqdefghijkl` of table
Record lock, heap no 167 PHYSICAL RECORD: n_fields 4; compact format;
*** (2) TRANSACTION:
TRANSACTION 2E0E, ACTIVE 4917 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1248, 2 row lock(s)
MySQL thread id 1, OS thread handle 0x1190, query id 41 192.168.xx.xx username upd
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 12295 n bits 528 index `uniqdefghijkl` of table
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 12295 n bits 528 index `uniqdefghijkl` of table
*** WE ROLL BACK TRANSACTION (1)
事务A | 事务B | 事务C |
开始 | ||
表的IX锁 17 @1 | ||
二级索引行锁X REC NOTGAP 1059 @2
检查死锁 没事
|
||
表IX锁 17 @3 | ||
二级索引记录行锁 REC NOTGAP X WAIT 1315 @4
检查死锁,没事
|
||
表IX锁 17 @5 | ||
二级索引记录行锁 REC NOTGAP X WAIT 1315 @6
检查死锁 没事
|
||
聚簇索引行锁X REC NOTGAP 1059 @7 | ||
wait.... suspend.... | wait.... suspend.... | |
commit | ||
wakeup this trx 将@4的WAIT去掉,成为1059 |
||
二级索引记录行锁 REC X WAIT 291 @8
检查死锁 发现死锁
|
- 首先这个锁是自己事务的
- 这个锁不是处于等待状态
- 当前锁的类型与precise_mode是兼容的,precise_mode值是X锁,因为这里是要做删除
- 当前锁不是NOT GAP类型,或者要加的锁类型是NOTGAP类型的,或者heapno为1
- 当前锁不是GAP类型,或者要加的锁类型是GAP类型的,或者heapno为1
- 当前锁不是意向插入锁
事务A | 事务B | 事务C |
begin | ||
delete
删除行数返回为1
|
||
begin | ||
delete 阻塞 | ||
begin | ||
阻塞 | ||
commit | ||
观察有没有死锁 其实并没有死锁 删除行数返回为0 |
||
删除行数返回为0 |
事务A | 事务B | 事务C |
开始 | ||
表的IX锁 17 @1 | ||
二级索引行锁X REC NOTGAP 1059 @2
检查死锁 没事
|
||
聚簇索引行锁X REC NOTGAP 1059 @7
检查死锁 没事
|
||
表IX锁 17 @3 | ||
二级索引记录行锁 REC X WAIT 291 @4
检查死锁,没事
|
||
表IX锁 17 @5 | ||
二级索引记录行锁 REC X WAIT @6
检查死锁 没事
|
||
wait.... suspend.... | wait.... suspend.... | |
commit | ||
wakeup this trx 将@4的WAIT去掉,成为 |
||
执行完成,提交 | ||
执行完成 |
事务A | 事务B | 事务C |
开始 | ||
表的IX锁 17 @1 | ||
二级索引行锁X REC NOTGAP 1059 @2
检查死锁 没事
|
||
表IX锁 17 @3 | ||
二级索引记录行锁 REC NOTGAP X WAIT 1315 @4
检查死锁,没事
|
||
表IX锁 17 @5 | ||
二级索引记录行锁 REC NOTGAP X WAIT 1315 @6
检查死锁 没事
|
||
对二级索引记录加删除标志(这个是最关键的) 这个交叉点就是:在锁@2与@7之间,有事务B加了锁@4,事务加了锁@6 |
||
聚簇索引行锁X REC NOTGAP 1059 @7 | ||
wait.... suspend.... | wait.... suspend.... | |
commit | ||
wakeup this trx 将@4的WAIT去掉,成为1059 |
||
二级索引记录行锁 REC X WAIT 291 @8
检查死锁 发现死锁
|
mysql中删除同一行会经常出现死锁?太可怕了的更多相关文章
- mySQL中删除unique key的语法 (删除某个字段的唯一性)
mySQL中删除unique key的语法 CREATE TABLE `good_booked` ( `auto_id` int(10) NOT NULL auto_increment, `goo ...
- MySQL 中删除的数据都去哪儿了?
不知道大家有没有想过下面这件事? 我们平时调用 DELETE 在 MySQL 中删除的数据都去哪儿了? 这还用问吗?当然是被删除了啊 那么这里又有个新的问题了,如果在 InnoDB 下,多事务并发的情 ...
- mysql中删除binlog的方法?mysql中如何删除binlog?
需求描述: 在mysql中如何删除binlog,因为随着数据库的运行,mysql中产生的binlog会越来越大,有可能把磁盘撑爆了,所以记录下删除 binlog的方法. 操作过程: 1.通过系统参数控 ...
- mysql中删除完全重复数据的准确SQL语句
删除数据库中重复的记录,只保留一条 DELETE FROM tb_gps_records WHERE id NOT IN (SELECT bid FROM (SELECT min(id) as bid ...
- MySQL中删除数据的两种方法
转自:http://blog.csdn.net/apache6/article/details/2778878 1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是trunc ...
- mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句
正好想写一条删除重复语句并保留一条数据的SQL,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 .如下: 表字段和数据: SQL语句: [sql] view plain cop ...
- mysql中删除重复数据
//首先我们需要知道我们重复的都有哪些数据, //第一步:进行对数据表进行分组,group by. //第二步:进行后通过having进行限制筛选,条数大于等于2的 //第三步:进行多表删除. //案 ...
- mySQL中删除unique key的语法
CREATE TABLE `good_booked` ( `auto_id` int(10) NOT NULL auto_increment, `good_id` int(11) default ...
- MySQL中删除重复数据的简单方法,mysql删除重复数据
MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式, ...
随机推荐
- Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
前言 如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文<Android:异步处理之Handler+Thread的应用(一)>:我们都知 ...
- JavaScript -- Document-Element
-----046-Document-Element.html----- <!DOCTYPE html> <html> <head> <meta http-eq ...
- CSS3 Drop-Shadows效果制作教程分享
要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识. 开发环境 Adobe Dreamweaver CS6/Chrome浏览器 演示地址 演示地址 Drop-Shadow效果,其实就是大家熟 ...
- Linux系列:Fedora虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)
首先声明:该方法在Fedora 17和18版本下有效,其它版本也许可行也许有所差异. 1. 虚拟机相关配置 如果不是虚拟机系统,则这步不需要,若是相关配置详细信息请看“Linux系列:Ubuntu虚 ...
- http缓存详解,http缓存推荐方案
前言 通过本文,你将了解到http缓存机制是怎样的,no-cache到底有没有缓存,地址栏回车,F5,ctrl+F5的区别,以及当下较为推荐的缓存方案等. 自从和前端组的同事一起整了个前端扫盲计划,想 ...
- bootstrap 通过js代码创建和关闭插件
插件的创建机制 默认情况下,boostrap.js文件被页面加载执行完成后,boostrap会自动根据html元素的data-toggle属性和相关class创建插件对象.有时候,我们不希望boost ...
- JavaWeb学习路线图
基本把JavaWeb的学了有一半了,在网上找了个学习路线图,供参考.
- 自动加载的iframe高度自适应
动态产生iframe,自动加载至body中,还有一个功能就是iframe的高度自适应,下面代码测试于IE和Firefox,Chrome:
- JS生成指定范围内的随机数(支持随机小数)
直接需要函数的话,直接到文章的最后面找. ============================================================= 转载:https://www.cn ...
- [日常] Go语言圣经--作用域,基础数据类型,整型
go语言圣经-作用域 1.一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变量 2.一个变量的生命周期是指程序运行时变量存在的有效时间段;声明语句的作用域对应的是一个源代码的文本区域,它是 ...