首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql insert into ..select 发生死锁问题。

mysql 对于业务较为复杂的功能,我们常常使用存储过程进行编辑数据库的操作,当我们在进行数据库的操作时,进行着函数的嵌套或者是数据的算法较为复杂时, 我们怎么样在一个事物中进行数据的处理呢。...一:错误的方案: insert into ..select 嵌套复杂的算法  from .....              FROM v_bill_items WHERE ward_code IS NOT NULL ; 此种方案虽然看着简单,实际上当算法的时间较为慢时 最为可能产生数据库的死锁问题...原因分析: 当使用insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会对select的表的纪录进行锁定。...二:使用游标进行便利循环插入 三: 使用group_concat 函数进行连接insert 字符串 统一进行数据的保存操作,效率最高。

2K30

mysql insert duplicate key update 死锁分析

背景 数据入库这块有离线和实时两套入库系统,写同一个db的同一批mysql表,两边用的都是insert into table on duplicate key update这种方式。...实时一直运行,离线5分钟更新一次,当两套系统同时运行时出现了死锁问题,频率还挺高。事务的隔离级别是read committed 读提交。...原因分析&解决方案 这里面分两种情况,一种是带主键的insert duplicate key update,一种是没有主键带唯一索引的insert duplicate key update。...此时实时任务获取了id为1数据的锁,等2的数据锁,离线任务获取了id为2的数据锁,等id为1数据锁,产生了死锁。...这种情况比较简单,处理方式有两种: 1、减少batch大小,减少了同一批数据中包含相同数据的概率,也就减少了死锁发生的概率 2、入库前对sql按照id排序,即使出现相同数据,只要保证顺序相同就不会出现死锁

4.2K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL案例:insert死锁与唯一索引

    背景死锁是每个 MySQL DBA 都经常会遇到的问题,之前也写过关于死锁的详细解析。多数时候死锁容易在 update 中发生,且一般是涉及到二级索引。...而本次遇到的问题是发生在 insert 上的死锁,与常规的场景不太一样,因此单独拿出来分析一下。...问题描述细节信息已脱敏,死锁信息来自于搭建的测试环境,使用的是腾讯云数据库 MySQL,版本为 5.7.18-txsql-log 20211031。...在 T4 阶段,insert 执行的时候就会进入锁等待的状态,因此选择在 T4 与 T5 之间查看系统表:mysql> select * from information_schema.innodb_locks...锁等待的有向图如下:图片因此这个 insert 中额外获取的锁导致了这个 delete+insert 的事务发生了死锁

    4.2K92

    MySQL RC模式insert update 可能死锁的情况

    涉及的语句为 RC模式下 update根据主键更新和insert 其实这样的问题在RC模式下,要么是简单update问题,要么是insert造成的主键和唯一键检查唯一性时出现问题。...                                                                          update testlll set name='gaopeng1' where id=24;(堵塞) 死锁...                                                                            update testlll set name='gaopeng1' where id=22;(堵塞) 死锁...这种情况比较简单不打印出锁结构 情况3 insert insert TX1:                                                      TX2: insert...into testlll values(26,'gaopeng');(堵塞) 死锁 锁结构: ---TRANSACTION 422212176315800, not started 0 lock struct

    1.1K21

    Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

    前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助。...: 并发环境下,执行insert into … on duplicate key update…导致死锁 死锁模拟复现: 事务一执行: mysql> begin; //第一步 Query OK, 0...冲突 兼容 兼容 冲突 Record 兼容 兼容 冲突 冲突 Next-Key 兼容 兼容 冲突 冲突 这是MySql5.7的一个bug 如何避免该insert on duplicate死锁问题 1...本文总结(重要) 本文介绍了MySql5.7死锁的一个bug。我们应该怎样去排查死锁问题呢?...参考与感谢 一条Insert on duplicate引发的血案 读 MySQL 源码再看 INSERT 加锁流程 解决死锁之路 - 了解常见的锁类型 MySQL InnoDB 锁——官方文档 MySQL

    2.2K20

    Mysql刨根:由Insert与uniqueKey的竞争引发死锁

    图片 0、前言 通过前文《数据库温故:Mysql底层原理起底》我们已经学过了Mysql的事务隔离级别等基础知识,现在我们可以利用所学,来分析一下生产环境出现的死锁问题了。...1.4 RC隔离级别可能造成的GapLock 在Mysql5.7版本官方文档下,有对 间隙锁GapLock 有这样一段陈述(见下图)。...3.1 造成死锁的事务 3.1.1 事务A 图片 分析: 事务A是一条insert语句,目的是批量写入数据 命中了唯一索引uniq_index_on_task_id_and_project_id_and_file_license_source...4.1.2降低并发插入的概率 批量插入的异步线程之间,通过线程休眠的方式,既能降低并发insert操作的概率,也能降低Mysql-Server负载; 4.1.3先查后插 降低重复数据的并发插入,哪些已经持久化的数据...参考文章 MySQL案例:insert死锁与唯一索引( https://cloud.tencent.com/developer/article/2017355?

    657147

    insert on duplicate key死锁问题分析

    // insert on duplicate key死锁问题分析 // 开始今天的文章之前,先说明下昨天文章中的一个错误,昨天文章最后说replace into带来的死锁问题可以使用insert...死锁信息对应的命令行输出如下: mysql:yeyztest 22:14:18>>begin; Query OK, 0 rows affected (0.00 sec) mysql:yeyztest 22...当我们将3个session中的replace的方法全部换成insert into ... on duplicate key的时候,该问题没有得到解决,还是报一样的错误,如下: mysql :yeyztest...该网址上面的例子,几乎完整的复现了上述死锁的情况,就是说,加入有两条并发的insert操作要对同一条记录加共享锁,而此时这条记录又被其他事务加上了排它锁,当排它锁的事务回滚或者提交之后,两个并发的insert...操作是会发生死锁的,原因是由于这两条并发的insert操作,都对这条记录加上了共享锁,所以都无法获取该条记录的排它锁,除非一条insert语句回滚。

    2.1K20

    记录一次Mysql死锁事件(由Insert与uniqueKey导致)

    | 导语记录一次于2023年01月23日遇到的死锁问题。...3.1 造成死锁的事务 3.1.1 事务A 解读 事务A是一条insert语句,目的是批量写入数据 命中了唯一索引uniq_index_on_task_id_and_project_id_and_file_license_source...4.1.2 降低并发插入的概率 批量插入的异步线程之间,通过线程休眠的方式,既能降低并发insert操作的概率,也能降低Mysql-Server负载; 4.1.3先查后插 降低重复数据的并发插入,哪些已经持久化的数据...unique index locks on DELETE + INSERT with same values (https://bugs.mysql.com/bug.php?...参考文章 MySQL案例:insert死锁与唯一索引(https://cloud.tencent.com/developer/article/2017355?areaSource=&traceId=)

    66420

    故障分析 | 从 Insert 并发死锁分析 Insert 加锁源码逻辑

    基于解决死锁问题存在的难点,本文以MySQL数据库一则并发Insert导致的死锁为例,从发现问题、重现问题、根因分析、解决问题4个步骤,期望能提供一套关于死锁的科学有效方案,供读者朋友参考。...根据以上信息,发现是 dl_tab 执行insert操作导致死锁。...Q6: 执行的SQL语句应该是导致死锁最直接的原因,其本质锁的是记录、锁类型及堵塞关系,如何查看? Q7: 死锁发生后,由于MySQL死锁检测机制会自动发现死锁,并会挑选事务进行回退。...四、根因分析 通过上述过程,可以看到死锁发生的过程,获取的锁及其属性信息。但要分析出为什么会发生死锁,还需要结合MySQL的锁实现机制。...图片 2、最终死锁过程 以时间维度,结合以上的mysql加锁逻辑进行分析: A. T1、T2开启了一个事务,随后T1执行了插入(26,10)的insert语句 B.

    95011

    3个Insert导致的死锁问题

    锁种类 插入意向锁(insert intention lock) 对已有数据行的修改与删除,必须加强互斥锁 X 锁,那对于数据的插入,是否还需要加这么强的锁,来实施互斥呢?插入意向锁,孕育而生。...插入意向锁是间隙锁(Gap Locks)的一种,它是专门针对 insert 操作的,也是为数不多的在 RC 级别下产生 Gap 锁情况 锁兼容性 排他锁 X 排他意向锁 IX 共享锁 S 共享意向锁...避免并发操作同一个有唯一约束的值 - 若是单实例(客户端单个主机服务)内出现,可以通过go的内存锁来避免并发同一行 - 若是实例间并发,可通过redis来实现分布式锁,从而避免并发同一行 三个并发导致insert...into t values(6,6,6); 持有IX锁 持有X记录锁 insert into t values(6,6,6);(block)持IX锁,等待持有S记录锁 insert into...成功,另一个死锁退出 操作如下 事务1 : 事务2: ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting

    12510

    讲讲insert on duplicate key update 的死锁

    当然如果你对锁不是很熟悉的话你可以先看我的这两篇文章看一下数据库锁的基础知识: 为什么开发人员必须要了解数据库锁:和记一次神器的mysql死锁排查 2.问题分析 数据库代码如下: CREATE TABLE...之前没有遇到过insert死锁的情况,所以当时觉得是on dpulicate key update导致的。...一般的死锁日志都是由两个事务导致的,所以会给予一定的迷惑性,其实大部分的死锁都是由两个以上的事务导致的,这次其实也不例外,这其实是mysql的一个bug,https://bugs.mysql.com/bug.php...在 https://bugs.mysql.com/bug.php?...我们有下面的一些方法来解决这个问题: 使用mysql5.6版本,可以看见这个是在5.7中引入的,5.6中不会出现这个情况 使用RC级别,RC隔离级别下不会有gap锁 -- 不要使用 insert on

    21K41

    唯一键insert into on duplicate 死锁问题

    `u_idx_alias` (`alias`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 隔离级别为RR 数据库版本5.7.20 插入数据 insert...into test(alias,age) values(1,1),(3,3),(5,5),(7,7); 死锁前提条件:多个并发同时执行insert into on duplicate update xxx...插入到这个范围时会获取这个范围的插入意向锁,此时如果这个范围有gap锁,则会阻塞当前插入,同时因为阻塞的插入意向锁,所以不会对后续相关的insert进行额外阻塞 MySQL45讲说 所以我个人理解RR...就是通过gap锁锁住插入意向锁来避免幻读的,这块大神有不同见解的话欢迎指导一下 3、本案例如何形成的死锁 1、锁兼容性 兼容性(获取/持有) Gap Insert Intention Record Next-Key...锁,因为事务1持有gap锁的范围包含11,所以意向锁被阻塞,等待中 T4时间事务1提交,gap锁释放 此时事务2的意向锁被事务3持有的gap锁锁住,事务3的意向锁被事务2持有的gap锁锁住,因此形成死锁

    1.1K30

    MySQLmysql死锁以及死锁日志分析

    1.死锁的概念 死锁死锁一般是事务相互等待对方资源,最后形成环路造成的。 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。...DELETE from users where uid='bbb';执行成功 3 DELETE from users where uid='bbb';等待 空 4 ERROR 1213 (40001) insert...从日志的WAITING FOR THIS LOCK TO BE GRANTED块中我们可以看到事务2正在申请持有索引UID的S锁,该锁是insert INTO users VALUES(2,'bbb')...insert语句在普通情况下是会申请X锁,但是这里出现了S锁。...这是因为uid字段是一个唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对uid字段进行修改。 那么为什么该S锁会失败呢?

    3.7K41

    Mysql Innodb 锁机制 select * from table where?insert?delete?update?3个insert死锁2个update的死锁3个以上delete的死

    在InnoDB存储引擎中的latch,可以通过命令SHOW ENGINE INNODB MUTEX 来进行查看 mysql > SHOW ENGINE INNODB MUTEX; ?...这个共享锁在并发的情况下是会产生死锁的,比如有两个并发的insert都对要对同一条记录加共享锁,而此时这条记录又被其他事务加上了排它锁,排它锁的事务将这条记录删除后,两个并发的insert操作会发生死锁...); insert into deadlocktest (a,b,c,d,e)values(3,997,4,5,6); insert into deadlocktest (a,b,c,d,e)values...(4,996,3,4,5); ... insert into deadlocktest (a,b,c,d,e)values(1000,1,3,4,5); 3个insert死锁 事务A 事务B 事务C...3个delete的死锁比较难以复现,我是利用如下脚本完成的 MY_DB="mysql -hxxx -Pxxx -uxxx -pxxx" while : do echo "use test;begin;

    1.6K80

    mysql insert into as_mysql insert into select使用方法详解

    mysql insert into select使用方法详解2017-11-22 15:47 我们先来看看mysql insert into select的语法规则。...DELAYED被忽略INSERT … SELECT。 该INSERT语句的目标表可能出现在查询部分的FROM子句中SELECT。但是,不能插入到表中并从子查询中的同一个表中进行选择。...在从同一个表中选择并插入时,MySQL创建一个内部临时表来存放来自这些表的行SELECT,然后将这些行插入到目标表中。...为确保二进制日志可用于重新创建原始表,MySQL不允许并发插入INSERT … SELECT语句。...由于这个问题,在MySQL 5.5.18中, INSERT…SELECT ON DUPLICATE KEY UPDATE和INSERT IGNORE… SELECT语句被标记为不安全的基于语句的复制。

    1.9K30

    MSSqlServer Select与Insert高并发下的死锁

    随后接到系统室的通知,数据库层面有大量死锁,CPU 利用率已达到瓶颈值,随后跟市场部联系将游戏入口切换到升级页面,停掉应用,迅速协查原因。 BI 报表和 Zabbix 监控 ? ? ?...INTO LE_LOG VALUES(); 先拿到聚集索引的排它锁,将要插入的行进行物理排序,然后对非聚集索引进行维护 -- 注意,MYSQLINSERT在RR隔离级别下还有GAP锁的存在。...原因分析(查询事务隔离级别应该为 READ UNCOMMITTED) 在本文的场景中,问题可能就出在非聚集索引与聚集索引的死锁问题上 步骤 Select 过程 Insert 过程 1 Select 获取到对应用户抽奖记录的行共享...4 Insert 需要同步更新非聚集索引,试图获取排它锁 X,被 S 锁阻塞! 所以死锁发生了。。。...大量的事务回滚应该是为了防止死锁造成数据库宕机设置的锁超时机制造成的,一旦无法插入或者查询日志记录就出现了大量的回滚或者连接强制断开,也就是我们在异常日志中看到的。

    1.4K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券