当前位置: 首页 > news >正文

mysql load data 卡死_MySQL中由load data语句引起死锁的解决案例

一个线上项目报的死锁,简要说明一下产生原因、处理方案和相关的一些点.

1、背景

这是一个类似数据分析的项目,数据完全通过LOAD DATA语句导入一个InnoDB表中。为方便描述,表结构简化为如下:

Create table tb(id int primary key auto_increment, c int not null) engine=innodb;

导入数据的语句对应为

Load data infile ‘data1.csv' into table tb;

Load data infile ‘data2.csv' into table tb;

cat Data1.csv

1 100

2 100

3 100

Cat data2.csv

10 100

11 100

12 100

产生死锁的证据是在show engine innodb status的LATEST DETECTED DEADLOCK段中看到死锁信息,简化为如下:

1A14025P-0.jpg

说明

从上面表格中看出,事务1在等待某一行的锁。而事务2持有这行的锁,但等待表的自增锁(AUTO_INC),判断为死锁,事务回滚。

这里事务1没有写出来,但是可以推断,事务1持有这个表的自增锁(否则就不是死锁了)。

2、背景知识1:AUTO_INC lock 及其选项

在InnoDB表中,若存在自增字段,则会维护一个表级别的锁,这里称为自增锁。每次插入新数据,或者update语句修改了此字段,都会需要获取这个锁

由于一个事务可能包含多个语句,而并非所有的语句都与自增字段有关,因此InnoDB作了一个特殊的处理,自增锁在一个语句结束后马上被释放。之所以说是特殊处理,是因为普通的锁,都是在事务结束后释放。

若一个表有自增字段,一个insert语句不指定该字段的值,或指定为NULL时,InnoDB会给它赋值为当前的AUTO_INCREMENT的值,然后AUTO_INCREMENT加1。

与这个自增锁相关的一个参数是innodb_autoinc_lock_mode. 默认值为1,可选为0,1,2。

我们先来看当这个值设置为0时,一个有自增字段的表,插入一行数据时的行为:

1) 申请AUTO_INC锁

2) 得到当前AUTO_INCREMNT值n,给AUTO_INCREMENT 加1

3) 执行插入操作,并将n填入新增的行对应字段中

4) 释放AUTO_INC锁

我们看到这个过程中,虽然InnoDB为了减少锁粒度,在语句执行完成就马上释放,但这锁还是太大了――它包括了插入操作的时间。这就导致了两个insert语句,实际上没办法并行。

没有这个参数之前,行为就是与设置为0相同,0这个选项就是留着兼容的。

很容易想到设置为1的时候,应该是将3) 和 4)对调。但是本文还是要讨论为0的情况,因为我们的前提是LOAD语句,而LOAD语句这类插入多行的语句中(包括insert …select …),即使设置为1也没用,会退化为0的模式。

3、背景知识2:LOAD DATA语句的主从行为

相关文章:

  • 什么是命令行参数_写命令行应用程序什么不可或缺?Go可以这样处理命令行参数...
  • python做简单的游戏名字_零基础Python实战(二),20行写个剪刀石头布游戏
  • python拆分参数列表_Python:使用itertools将列表拆分为组的参数
  • python语言哪种最好_学习Python语言选择哪种方式好?
  • rc时间常数定义_时间常数RC的计算方法
  • mysql 进行数据维护_MySQL从库维护经验分享
  • jsp mysql 导出 excel乱码_jsp存取mysql中文数据结果为乱码的解决方法(转自自己以前的blog)...
  • python面向对象基础知识_python面向对象的基础知识
  • mysql递归查询及节点层级_Mysql中的递归层次查询(父节点下的所有节点)
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • datax把text转mysql_使用DataX实现mysql数据迁移
  • haccp体系的参照标准是_食品安全标准与ISO、GMP、HACCP等体系之间的相互关系
  • mac mysql 多实例_Mac上mysql多端口实例配置并设置开机自动启动
  • mysql 主要有哪些函数_mysql中有哪些函数
  • mysql索引失效解决6_简单介绍MySQL索引失效的几种情况
  • Android 控件背景颜色处理
  • Brief introduction of how to 'Call, Apply and Bind'
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS 三角实现
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Gradle 5.0 正式版发布
  • Java 多线程编程之:notify 和 wait 用法
  • Java,console输出实时的转向GUI textbox
  • JavaScript DOM 10 - 滚动
  • markdown编辑器简评
  • mysql 数据库四种事务隔离级别
  • PAT A1050
  • SQL 难点解决:记录的引用
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从零开始的无人驾驶 1
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 反思总结然后整装待发
  • 解决iview多表头动态更改列元素发生的错误
  • 蓝海存储开关机注意事项总结
  • 使用SAX解析XML
  • 消息队列系列二(IOT中消息队列的应用)
  • 智能合约开发环境搭建及Hello World合约
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # C++之functional库用法整理
  • ${ }的特别功能
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (SpringBoot)第二章:Spring创建和使用
  • (二)c52学习之旅-简单了解单片机
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (离散数学)逻辑连接词
  • (力扣题库)跳跃游戏II(c++)
  • (四) Graphivz 颜色选择
  • ***通过什么方式***网吧
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Project Open Day(2011.11.13)
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况