前言
    我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则更新它如果更新日期或者某些列上的累加操作等,我们肯定会想到使用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*(转)相关推荐

  1. insert ... on duplicate key update产生death lock死锁原理

    转载自  insert ... on duplicate key update产生death lock死锁原理 前言 编辑 我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则 ...

  2. “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”

    在执行包含多行的INSERT语句时,我想跳过重复的条目,否则它们会导致失败. 经过研究后,我的选择似乎是使用以下任一方法: ON DUPLICATE KEY UPDATE ,这意味着要付出一定的代价进 ...

  3. MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况

    MySQL的INSERT ··· ON DUPLICATE KEY UPDATE使用的几种情况 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句 ...

  4. insert...on duplicate key update语法详解

    一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别 ...

  5. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE

    (转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT - ON DUPLICATE KEY UPDA ...

  6. MySQL的INSERT INTO··· ON DUPLICATE KEY UPDATE使用的几种情况

    保存或更新 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新:如 ...

  7. 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 ...

  8. mysql insert into on_MySQL之INSERT INTO ON DUPLICATE KEY UPDATE用法详解 | 夕辞

    MySQL数据库使用中如果主键或唯一键冲突,会报错,因此我们会用到insert into on duplicate key update语法,但是该语法具体怎么用以及返回什么值,今天就来讨论下. 首先 ...

  9. 为什么不建议使用ON DUPLICATE KEY UPDATE

    昨天评审代码时,大佬同事看到我代码里使用了mysql的on duplicate key update语法实现了对数据的save or update,说这个语法有严重的性能和其他隐患问题,让我必须改成先 ...

  10. SQL语句中ON DUPLICATE KEY UPDATE column=IF(条件,值1,值2 ) 的使用

    Insert...on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错.笔者最近写代码的时候却碰到一个需 ...

最新文章

  1. 安徽自考计算机基础考试时间,安徽2021年4月自考考试时间
  2. iOS 9应用开发教程之编辑界面与编写代码
  3. 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...
  4. mysql.net开发驱动_mysql数据库.net开发驱动(mysql connector net )
  5. 胡玥的侦探小说《做局》及自传《时间之夜》
  6. 前出塞数据挖掘的一些必须了解的概念
  7. 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwave数据的案例研究
  8. 【CTF】某xss练手小游戏
  9. EXCEL VBA连接SQL数据库
  10. 夜深人静写算法(十二)- 凸包
  11. java让星星闪烁,js实现星星闪特效
  12. M-Arch(12)第十一个示例:如何用无源蜂鸣器播放音乐
  13. 杂谈:加班中离世的人
  14. java-集合框架库-ArrayList
  15. 2019年中国研究生数学建模竞赛D题 汽车行驶工况构建
  16. Number of Pairs(思维)
  17. 厦门故事(三):枫叶随风飘落,重重地摔在了地面上
  18. putty 遂道_为什么将网络隧道称为“隧道”?
  19. zuk android os 流量,ZUK Z1国际版:细数Cyanogen OS的几点不同
  20. winXP安装FTP及连接FTP

热门文章

  1. Java常用JSON库FastJson,Gson,Jackson,Json-lib性能及特点比较,常用工具方法
  2. Prototype使用$F()函数
  3. [渝粤教育] 江西理工大学 新融合大学英语(I) 参考 资料
  4. 【sklearn第十一讲】随机梯度下降
  5. 给定一个正整数,计算有多少对质数的和等于输入的这个正整数
  6. script标签的使用,从零开始
  7. memset()函数及其作用
  8. docunment对象
  9. JAVA入门[14]-Spring MVC AOP
  10. Commons-VFS 使用SFTP