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

MySQL并发插入导致死锁

大家好,我是「云舒编程」,今天我们来聊聊# MySQL并发插入导致死锁。...该服务是一个老服务,至少有一年没有人改动过该接口,并且租户这个场景只支持创建和查询,其他能力都不支持。收到报警的一刻,内心充满了疑惑:"这也能死锁?"...死锁日志 先是到MySQL上获取了死锁日志: 关于插入意向锁,MySQL官网有如下解释说明: 结合死锁日志官网说明大概推断死锁原因是: 事务一持有了某个记录的S型Next_LOCK锁(也就是S...也就是说在MySQL层产生了并发插入。 同时发现插入数据的代码居然是使用的for循环插入,而不是批量插入。...,不可能产生死锁啊 就在产生疑惑的时候,线上又出了一例死锁,查看死锁日志请求日志。

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

mysql 优化海量数据插入查询性能

因此,优化数据库插入性能是很有意义的。 修改mysql数据库配置: 0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似); 1....这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binloginnodb的事务让日志) 减少了,降低日志刷盘的数据量频率,从而提高效率。...COMMIT; 使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。...mysql数据库查询优化方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...合理的索引设计要建立在对各种查询的分析预测上。

3.7K20

大招落地:MySQL 插入更新死锁源码分析

读者反馈了一个死锁案例,比较有意思,上一篇文章讲了怎么通过调试源码来分析锁,今天再来分析一个死锁场景。...tenant_config` (`tenant_id`, `open_card_point`) VALUES (123,0); 数据库隔离级别:RC 第一种情况:两条 insert,两条 update 事务 1 事务...VALUES (123,111111); UPDATE tenant_config SET open_card_point = 0 where tenant_id = 123; 代码的逻辑大概如下,先插入...第二种情况:一条 insert,两条 update 第一步:事务 1,插入唯一键冲突 begin; INSERT INTO `tenant_config` ( `tenant_id`, `open_card_point...也就是:t1 的 insert 插入加了 S 锁,t2 的 X 锁虽然没加成功,但是真实存在,标记为等待状态。t1 再想获取 X 锁,发现与 t2 等待状态的 X 锁冲突。

68030

MySQLmysql死锁以及死锁日志分析

1.死锁的概念 死锁死锁一般是事务相互等待对方资源,最后形成环路造成的。 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。...发生死锁会返回ERROR:1213 错误提示,大部分的死锁InnoDB存储引擎本身可以侦测到,不需要人为进行干预。...注意: InnoDB存储引擎并不会回滚大部分的错误异常,像阻塞章节里面的例子,但是死锁例外,发现死锁后,InnoDB存储引擎会马上回滚一个事务,会返回1213错误。...这是因为uid字段是一个唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对uid字段进行修改。 那么为什么该S锁会失败呢?...通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样的循环等待,再加以分析,就可以逆向推断出循环等待的成因,也就是死锁形成的原因。

3.4K41

MySQL常用SQL语句:插入更新删除查询

整理一些MySQL常用SQL语句:插入、更新、删除、查询、根据指定的列对结果集进行排序等。...为联合主键,并且分别对应于student表的snocourse表的cno。...插入 (1) 不指定列名 insert into student values (218004, '龙猫', '男', '23') 注意:如果不指定插入的列名,则value中的值要对应表中的每一列,若少列...(1) 连接查询 连接查询是数据库查询中最常用的一种查询语句,是指通过连接字段连接条件连接多个表从而进行查询,连接查询又分为小类:等值连接、非等值连接 、内连接、外连接、自然连接、自身连接。  ...其中,UNIONUNION ALL都会做并集,但UNION会去除重复的记录。最后,MySQL不支持INTERSECTEXCEPT。

5.1K30

MySQL相关 – 死锁的发生避免

在我们使用锁的时候,有一个问题是需要注意避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。...[Err] 1205 – Lock wait timeout exceeded; try restarting transaction MySQL 有一个参数来控制获取锁的等待时间,默认是 50 秒。...死锁的发生检测 死锁演示: Session 1 Session 2 begin;select * from t2 where id =1 for update; – begin;<br /...如果一个事务长时间持有锁不释放,可以 kill 事务对应的线程 ID ,也就是 INNODB_TRX 表中的 trx_mysql_thread_id,例如执行 kill 4,kill 7,kill 8。...,避免没有 where 条件的操作,避免锁表; 如果可以,大事务化成小事务; 使用等值查询而不是范围查询查询数据,命中记录,避免间隙锁对并发的影响。

66920

MySQL死锁详解及检测避免

上一篇博客我们知道的Mysql事务的隔离机制实现,以及锁的详细解析 链接: 详解MySQL脏读幻读不可重复读及事务的隔离级别MVCC、LBCC实现,还有锁的详解 在我们使用锁的时候,有一个问题是需要注意避免的...文章目录 锁的释放与阻塞 死锁的发生检测 查看锁信息(日志) 死锁的避免 锁的释放与阻塞 回顾:锁什么时候释放? 事务结束(commit,rollback)﹔ 客户端连接断开。...[Err] 1205 - Lock wait timeout exceeded; try restarting transaction MySQL有一个参数来控制获取锁的等待时间,默认是50秒。...死锁的发生检测 演示一下,开两个会话: 方便对时间线的提现,这里用图片,有兴趣的可以跟着模仿一下 栗子一: 栗子二: 在第一个事务中,检测到了死锁,马上退出了,第二个事务获得了锁...; 4、尽量使用索引访问数据,避免没有where条件的操作,避免锁表; 5、如果可以,大事务化成小事务; 6、使用等值查询而不是范围查询查询数据,命中记录,避免间隙锁对并发的影响。

69620

MySQL死锁浅析

中的锁 要想搞清 MySQL 中的死锁问题,那必然得先了解下 MySQL 锁知识!...MySQL如何加锁 锁的兼容互斥性 意向锁之间都互相兼容; 间隙锁之间都相互兼容,间隙锁插入意向锁互斥,间隙锁目的是保护该间隙不被插入新数据; 行级读锁行级读锁兼容,行级读锁行级写锁互斥,行级写锁行级写锁互斥..., next-key lock 会退化为间隙锁; 范围查询:范围查询需要访问到不满足条件的第一个值为止; insert语句: 普通insert情况,只加IX表锁插入意向锁; 若其他线程并发插入同一索引位置时...RC 隔离级别下: RR 类似,没有间隙锁临键锁,查询过程中访问到的对象才会加锁,加锁的基本单位为记录锁,语句执行完就释放“不满足条件的行”的记录锁,“满足条件的行”的记录锁才在事务结束时才释放。...死锁 何为死锁 MySQL 中不同的锁之间存在兼容互斥关系,如果线程 1 中需要的锁资源 C 线程 2 中拥有的锁资源 B 互斥,线程 1 就会阻塞等待线程 2 释放锁 B ;线程 2 需要的锁资源

26010

MySQL(八)子查询分组查询

(实际上,MySQL执行了2个select操作),where子句中使用子查询,必须保证select语句具有与where子句中相同数目的列;   子查询一般与in操作符结合使用,但也可用于测试等于(=)、...格式化SQL:包含子查询的select语句一般相较来说阅读调试更为不方便,特别是它比较复杂的情况下,因此把子查询分解为多行并且适当缩进,能极大的简化子查询的使用。...,orders是一个计算字段,由圆括号内的子查询建立,它对检索出的每个用户执行一次, 子查询中where子句它使用了完全限定表名,它告诉SQL比较orders表usertable表中的user_id列...相关子查询(correlated subquery):涉及外部查询的子查询(任何时候只要列名可能存在多叉性,就必须使用这种语法[表名列名有一个句点分隔])。...PS:使用子查询建立查询的最可靠方法是逐渐进行(首先建立最内层的查询,确认后用硬编码数据建立外层查询,由内到外) 二、组合查询 MySQL允许执行多个查询(多条select语句),并将结果作为单个查询结果集返回

3.6K20

MySQL——优化嵌套查询分页查询

,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作;并且Not exists表示MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了...优化分页查询MySQL中做分页查询MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行,那当 offset 特别大的时候,效率就非常的低下...例如“limit 1000,20”,此时MySQL排序出前1020条数据后仅仅需要第1001到1020条记录,前1000条数据都会被抛弃,查询排序的代价非常高。...通过索引覆盖在索引上完成扫描排序(索引有序),最后通过主键(InnoDB引擎索引会通过主键回表)回表查询,最大限度减少回表查询的I/O次数。...总结 对于嵌套查询分页查询的优化,归根结底就是遵循SQL优化原则之一——减少回表查询的I/O次数。对于分页查询优化,更建议使用第一种优化方案,性能更好,稳定性更高。 参考 《深入浅出MySQL

2.8K21

mysql的事务隔离幻读死锁问题

不可重复读:事务不可以读取未提交的数据,但是如果在另一个事务修改并提交了数据,此时可以读取到,同一事务两次相同的select结果可能会不同 幻读:事务不可以读取未提交的,也不能读取修改提交的,但是当另一个事务插入新数据提交后...,我本次事务有时会插入冲突,或者更新时更新的数据多了 加锁:强制串行执行,锁开销比较大 4.查看隔离级别: select @@global.tx_isolation, @@tx_isolation; |...| +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ 5.幻读问题 开启事务,查询数据...此时有另外的会话插入新数据 ? 再次查询新数据不会出现,但是插入时会报错 ?...6.mysql 死锁: 1.两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,导致恶性循环 2.解决这种问题,检测到死锁的循环依赖,立即返回一个错误 3.时间达到了锁等待超时限定,放弃锁请求

61320

MySQL死锁系列-线上死锁问题排查思路

前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常。...这种死锁异常一般要在特定时间特定数据特定业务操作才会复现,并且分析解决时还需要了解 MySQL 锁冲突相关知识,所以一般遇到这些偶尔出现的死锁异常,往往一时没有头绪,不好处理。...本篇文章会讲解一下如果线上发生了死锁异常,如何去排查处理。除了系列前文讲解的有关加锁锁冲突的原理还,还需要对 MySQl 死锁日志 binlog 日志进行分析。...所以,面对线上偶发的 MySQL 死锁问题,我的排查处理过程如下: 线上错误日志报警发现死锁异常 查看错误日志的堆栈信息 查看 MySQL 死锁相关的日志 根据 binlog 查看死锁相关事务的执行内容...lock_mode X locks rec but not gap waiting // -6 等待获取锁的信息 在 《锁类型和加锁原理》 一文中我们说过,一共有四种类型的行锁:记录锁,间隙锁,Next-key 锁插入意向锁

4.8K22
领券