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返回系统Home桌面
Intent intent = new Intent(); // 为Intent设置Action.Category属性 intent.setAction(Intent.ACTION_MAIN);// ...
- 使用 IntelliJ IDEA 导入 Spark 最新源码及编译 Spark 源代码(博主强烈推荐)
前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. 准备工作 1.sca ...
- 阿里巴巴Java开发手册———总结
前言 阿里巴巴Java开发手册———个人追加的见解和补充(一) 阿里巴巴Java开发手册———个人追加的见解和补充(二) 阿里巴巴Java开发手册———个人追加的见解和补充(三) 阿里巴巴Java开发 ...
- Vue笔记:使用 Yarn 管理依赖包
上年10月份, Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm ,它比npm更快.更高效. Yarn VS npm 1.yarn.lock 文件 在 npm 中同样 ...
- 面试题----C语言中exit和return的区别
C语言中return和exit的区别 exit用于结束进程,返回的状态码是给操作系统使用或父进程使用的.return是堆栈返回,返回的值是给主调函数用的.主线程结束前会默认调用exit结束进程. ex ...
- Linux 一次杀死多进程
.- | 说明: “grep firefox”的输出结果是,所有含有关键字“firefox”的进程. “grep -v grep”是在列出的进程中去除含有关键字“grep”的进程. “-”是截取输入行 ...
- Java基础——ArrayList与LinkedList(一)
一.定义 ArrayList和LinkedList是两个集合类,用于储存一系列的对象引用(references). 引用的格式分别为: ArrayList<String> list = n ...
- 愿你走出半生,归来仍是Java Parser
几天前,我的一个朋友给了我一个Haskell问题 Hey, MK,假设我有个BNF,并且我在Haskell中有个这个BNF的parser.现在,我想给这个BNF改一行,有没有办法不用动这个BNF pa ...
- 使用json-org包实现POJO和json的转换
使用json-org包实现POJO和json的转换 这个jar包把对象转换成json超级舒服,所以顺便记录一下吧 把单个pojo对象转换成json对象 Student student = new St ...
- LOJ1070(SummerTrainingDay05-B 矩阵快速幂)
Algebraic Problem Given the value of a+b and ab you will have to find the value of an+bn. a and bnot ...