死锁问题------------------------INSERT ... ON DUPLICATE KEY UPDATE*(转)
前言
我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则更新它如果更新日期或者某些列上的累加操作等,我们肯定会想到使用INSERT ... ON DUPLICATE KEY UPDATE语句,一条语句就搞定了查询是否存在和插入或者更新这几个步骤,但是使用这条语句在msyql的innodb5.0以上版本有很多的陷阱,即有可能导致death lock死锁也有可能导致主从模式下的replication产生数据不一致。
正文
正如前言说的那样,在实际业务中,曾经有过一个需求就是插入一条业务数据,如果不存在则新增,存在则累加更新某一个字段的值,于是乎就想到了使用insert... on duplicate key update这个语句,但是有一天去测试环境查看错误日志时,却发现了在多个事务并发执行同一条insert...on duplicate key update 语句时,也就是insert的内容相同时,发生 了死锁。
对于insert...on duplicate key update这个语句会引发dealth lock问题,官方文档也没有相关描述,只是进行如下描述:
An INSERT ... ON DUPLICATE KEY UPDATE statement against a table having more than one unique or primary key is also marked as unsafe. (Bug #11765650, Bug #58637)
也就是如果一个表定义有多个唯一键或者主键时,是不安全的,这又引发了以一个问题,见https://bugs.mysql.com/bug.php?id=58637
也就是
当mysql执行INSERT ON DUPLICATE KEY的 INSERT时,存储引擎会检查插入的行是否会产生重复键错误。如果是的话,它会将现有的
行返回给mysql,mysql会更新它并将其发送回存储引擎。当表具有多个唯一或主键时,此语句对存储引擎检查密钥的顺序非常敏感。根据这个顺序,
存储引擎可以确定不同的行数据给到mysql,因此mysql可以更新不同的行。存储引擎检查key的顺序不是确定性的。例如,InnoDB按照索引添加到
表的顺序检查键。
insert ... on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。
如果有两个事务并发的执行同样的语句,那么就会产生death lock,如:
具体的bug描述见:https://bugs.mysql.com/bug.php?id=52020
https://bugs.mysql.com/bug.php?id=58637
编辑
https://bugs.mysql.com/bug.php?id=21356
解决办法:
1、尽量不对存在多个唯一键的table使用该语句
2、在有可能有并发事务执行的insert 的内容一样情况下不使用该语句
---------------------
作者:个人技术博客-潘民兰
来源:CSDN
原文:https://blog.csdn.net/pml18710973036/article/details/78452688
版权声明:本文为博主原创文章,转载请附上博文链接!
转载于:https://www.cnblogs.com/GuangMingDingFighter/p/10709849.html
死锁问题------------------------INSERT ... ON DUPLICATE KEY UPDATE*(转)相关推荐
- insert ... on duplicate key update产生death lock死锁原理
转载自 insert ... on duplicate key update产生death lock死锁原理 前言 编辑 我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则 ...
- “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”
在执行包含多行的INSERT语句时,我想跳过重复的条目,否则它们会导致失败. 经过研究后,我的选择似乎是使用以下任一方法: ON DUPLICATE KEY UPDATE ,这意味着要付出一定的代价进 ...
- MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况
MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句 ...
- insert...on duplicate key update语法详解
一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别 ...
- (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE
(转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT - ON DUPLICATE KEY UPDA ...
- MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况
保存或更新 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新:如 ...
- mysql insert delayed_mysql insert的几点操作(DELAYED 、IGNORE、ON DUPLICATE KEY UPDATE )
INSERT语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] V ...
- mysql insert into on_MySQL之INSERT INTO ON DUPLICATE KEY UPDATE用法详解 | 夕辞
MySQL数据库使用中如果主键或唯一键冲突,会报错,因此我们会用到insert into on duplicate key update语法,但是该语法具体怎么用以及返回什么值,今天就来讨论下. 首先 ...
- 为什么不建议使用ON DUPLICATE KEY UPDATE
昨天评审代码时,大佬同事看到我代码里使用了mysql的on duplicate key update语法实现了对数据的save or update,说这个语法有严重的性能和其他隐患问题,让我必须改成先 ...
- SQL语句中ON DUPLICATE KEY UPDATE column=IF(条件,值1,值2 ) 的使用
Insert...on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错.笔者最近写代码的时候却碰到一个需 ...
最新文章
- 安徽自考计算机基础考试时间,安徽2021年4月自考考试时间
- iOS 9应用开发教程之编辑界面与编写代码
- 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...
- mysql.net开发驱动_mysql数据库.net开发驱动(mysql connector net )
- 胡玥的侦探小说《做局》及自传《时间之夜》
- 前出塞数据挖掘的一些必须了解的概念
- 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwave数据的案例研究
- 【CTF】某xss练手小游戏
- EXCEL VBA连接SQL数据库
- 夜深人静写算法(十二)- 凸包
- java让星星闪烁,js实现星星闪特效
- M-Arch(12)第十一个示例:如何用无源蜂鸣器播放音乐
- 杂谈:加班中离世的人
- java-集合框架库-ArrayList
- 2019年中国研究生数学建模竞赛D题 汽车行驶工况构建
- Number of Pairs(思维)
- 厦门故事(三):枫叶随风飘落,重重地摔在了地面上
- putty 遂道_为什么将网络隧道称为“隧道”?
- zuk android os 流量,ZUK Z1国际版:细数Cyanogen OS的几点不同
- winXP安装FTP及连接FTP
热门文章
- Java常用JSON库FastJson,Gson,Jackson,Json-lib性能及特点比较,常用工具方法
- Prototype使用$F()函数
- [渝粤教育] 江西理工大学 新融合大学英语(I) 参考 资料
- 【sklearn第十一讲】随机梯度下降
- 给定一个正整数,计算有多少对质数的和等于输入的这个正整数
- script标签的使用,从零开始
- memset()函数及其作用
- docunment对象
- JAVA入门[14]-Spring MVC AOP
- Commons-VFS 使用SFTP