2. 什么情况下“ON DUPLICATE KEY UPDATE”可能导致死锁 在并发环境下,当多个事务同时执行 INSERT ... ON DUPLICATE KEY UPDATE 语句,并且这些语句涉及相同的行或索引范围时,就可能发生死锁。特别是当这些事务尝试以不同的顺序访问相同的资源时,更容易发生死锁。
5.2、death lock死锁 有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。这个时候就可以用到ON DUPLICATE KEY UPDATE这个sql语句了。 以下内容基于本地windows环境mysql:8.0.34进行讲解。 一、ON DUPLICATE KEY UPDATE的介绍 基本用法:ON DUPLICATE KEY UPDATE...
同时我们可以证明这时code=3肯定是被排他锁锁住的,由于当出现唯一键冲突时,就会执行on duplicate key update,更新other字段,所以code=3一定在更新结束后处于排它锁锁定状态(补充说明:可以证明如果是共享锁的话,session2在T2时刻执行insert into test2(code, other) values (3, 33)语句的话,一定会立刻包duplicate e...
如果不存在则新增,存在则累加更新某一个字段的值,于是乎就想到了使用insert… on duplicate key update这个语句,但是有一天去测试环境查看错误日志时,却发现了在多个事务并发执行同一条insert…on duplicate key update 语句时,也就是insert的内容相同时,发生 了死锁。
1、将批量insert on duplicate key update,拆分成多个语句。保证一次事务中不要插入过多值,将多个数据,变成多个sql,执行插入。可以有效的减少死锁命中的发生。 2、重试:死锁不可怕,当出现死锁发生时,多执行重试操作可以有效保证插入成功,更新不丢失。 3、线程池多线程并发执行改为单线程排队处理。
昨天评审代码时,一群大佬看到有同事的代码里使用了mysql的on duplicate key update语法实现了对数据的save or update,说这个语法有严重的性能和其他隐患问题,必须改成先查询一次分出新增集合和修改集合,再分别进行批量新增和批量修改的方式进行,并对批量修改时使用...
昨天评审代码时,大佬同事看到我代码里使用了 mysql 的 on duplicate key update 语法实现了对数据的 save or update,说这个语法有严重的性能和其他隐患问题,让我必须改成先查询一次分出新增集合和修改集合,再分别进行批量新增和批量修改的方式进行,并对批量修改时使用 case when 的方式实现。
将批量insert on duplicate key update,拆分成多个语句。保证一次事务中不要插入过多值,将多个数据,变成多个sql,执行插入。可以有效的减少死锁命中的发生。 重试:死锁不可怕,当出现死锁发生时,多执行重试操作可以有效保证插入成功,更新不丢失。 参考文章:
昨天评审代码时,大佬同事看到我代码里使用了 mysql 的 on duplicate key update 语法实现了对数据的 save or update,说这个语法有严重的性能和其他隐患问题,让我必须改成先查询一次分出新增集合和修改集合,再分别进行批量新增和批量修改的方式进行,并对批量修改时使用 case when 的方式实现。
ON DUPLICATE KEY UPDATE 的使用 我们先看一下测试表的结构 主键为id 表中现有测试数据 case 1:含有ON DUPLICATE KEY UPDATE的INSERT语句中包含主键,且主键在表中已存在,执行更新操作 如果update语句后的主键不是insert语句后的主键,且表中已存在,那么更新或者插入操作都不会成功执行,会抛出主键冲突异常。 1 2 in...