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这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式, ...
随机推荐
- JavaScript -- Form
-----048-Form.html----- <!DOCTYPE html> <html> <head> <meta http-equiv="co ...
- vue修改对象属性值视图上没有更新
data(){ return { obj:{ name:' ' } } } 方法一: this.$set(this.obj, 'name', '新的值'); 方法二; Vue.set(vm.obj, ...
- vue2.0和better-scroll实现左右联动效果
在做移动端商城或者其他页面的时候,经常会遇到左右联动的效果,今天小编vue2.0和better-scroll这个插件一起实现左右联动效果. 实现上面的效果,思路一定很重要,还有需求 1. 左边一级分类 ...
- jdk1.6空轮询Bug的原因及解决方法
简述 本文主要介绍一下jdk1.6版本中的NIO Selector空轮询BUG,描述一下BUG的现象及原因,以及Netty中如何巧妙的规避了这个bug. 为什么要写这篇文章,说来惭愧,很久以前面试官问 ...
- visual studio code 个人设置
{ "vim.disableAnnoyingNeovimMessage": true, "php.validate.executablePath": " ...
- -bash: warning: setlocale: LC_CTYPE: cannot change locale (zh_US.UTF-8): No such file or directory -bash: warning: setlocale: LC_COLLATE:
前几天登录服务器发现出现了这些个警告,一直没时间去处理他,今天难得有空,处理一下并记录下来,希望可以帮助到有需要的朋友. 警告信息如下: Last :: from 10.0.0.1 -bash: wa ...
- 第4章 Selenium2-java WebDriver API (一)
4.1 从定位元素开始 WebDriver提供了八种元素定位方: 在Java语言中对应的定位方法: ·id findElement(By.id()) ·name findEleme ...
- springboot 单体架构之shiro集成
这里使用的是eclipse 开发工具 1.springboot 版本是2.0的,引入了2个shiro 的依赖,如下 <parent> <groupId>org.springfr ...
- SpringMVC源码阅读入门
1.导入 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中.正式的名称“Spring Web MVC”来自于它的源模块(spring-w ...
- ASCX呼叫ASPX.CS的方法
为了安全设计,一般情况之下,改用为接口(interface). 在网页中实现这个接口: 用户控件: 当然,把用户控件ascx拉至网页之后,在用户控件的linkbutton的click事件,就可以呼叫至 ...