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这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式, ...
随机推荐
- GO入门——4. 数组、切片与map
1. 数组 定义数组的格式:var [n],n>=0 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型 注意区分指向数组的指针和指针数组 //数组的指针 a := [2]int{1, ...
- Python基础之好玩的字符串格式化f-string格式
转自白月黑羽 Python3教程 : http://www.python3.vip/doc/tutorial/python/0010/#f-string-格式化 f-string 格式化 f-stri ...
- Java之建造者模式(Builder Pattern)(转)
1.概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者 ...
- 观察者模式——java设计模式
观察者模式 定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 1.观察者模式的结构 ( ...
- Andrew Ng机器学习课程笔记(二)之逻辑回归
Andrew Ng机器学习课程笔记(二)之逻辑回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364636.html 前言 ...
- FineUI开源版(ASP.Net)初学手册
女朋友鄙视我原创少... 1.下载 进入官方论坛:http://www.fineui.com/bbs/ 要用到下载源代码和空项目下载 http://fineui.codeplex.com/ http: ...
- Docker实战-为镜像添加SSH服务
1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...
- #if defined 和 #if ! defined 的用法
背景:MFC初学,头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define A ...
- Mybatis一对一,一对多
一对一 假如有student表(学生表)和student_card表(学生证表). student表中有一个字段self_card用来查student_card,student_card表中有一个st ...
- 为什么要用lock 【readonly】object?为什么不要lock(this)?
一. 为什么要用lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了.也就是说 ...