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入门学习总结
1.Manifest.xml是程序运行时读取的文件,是核心的配置文件:也是从中读取Activity 2.主要的代码文件存放在MainActivity.java,里面固定会有onCreate函数会通过s ...
- 深入聊聊Java多线程
一.背景 在没有学习Java多线程以前,总觉得多线程是个很神秘的东西,只有那些大神才能驾驭,新年假期没事就来学习和了解一下Java的多线程,本篇博客我们就来从头说一下多线程到底是怎么回事. 二.概述 ...
- Dubbo剖析-SPI机制
文章要点: 1.什么是SPi 2.Dubbo为什么要实现自己的SPi 3.Dubbo的IOC和AOP 4.Dubbo的Adaptive机制 5.Dubbo动态编译机制 6.Dubbo与Spring的融 ...
- Iptables之recent模块小结
Iptables的recent模块用于限制一段时间内的连接数, 是谨防大量请求攻击的必杀绝技! 善加利用该模块可充分保证服务器安全. recent常用参数--name 设定列表名称,即设置跟 ...
- (原)SQL Server 代理作业执行持续时间简述
本文目录列表: 1.SQL Server 代理作业概述2.获取代理作业执行时间方法一 3.获取代理作业执行时间方法二4.总结语 5.参考目录清单列表 正文: 1.SQL Server 代理作业概述 ...
- [android] 优酷环形菜单-相对布局练习
优酷环形菜单 布局文件,使用<RelativeLayout/>控件作为第一级菜单,相对布局,位于父控件的底部,水平居中,因为图片不是特别的标准,因此宽度和高度都钉死,宽度是高度的两倍 二次 ...
- Java基础——Servlet(三)
还在学习Servlet,觉得这里的知识点蛮多的.还要继续努力,加油. 拿韩老师的话激励一下自己,共勉.韩老师说,“成功其实也不难,只要树立一个目标,不需要你是一个很强的人,不需要你很高智商,不需要你是 ...
- SpringIOC的小例子
IOC IOC--Inversion of Control即控制反转,常常和DI--依赖注入一起被提到. 核心是为了解除程序之间的耦合度. 那么什么样的代码是耦合度高的呢? 假如有个人现在去买苹果 i ...
- Android8自定义广播无法收到消息
在Android 8之前,如果要发送自定义的静态广播,做好其他配置后,只需实例化一个Intent对象intent,然后将其作为参数传入sendBroadcast()方法中即可,例如 Intent in ...
- Android Interpolator(插值器)
1.概述 插值器定义如何计算动画中的特定值作为时间的函数.例如,指定动画在整个动画中线性发生,这意味着动画在整个时间内均匀移动,或者指定动画以使用非线性时间,例如,在开始或结束时使用加速或减速动画. ...