大家好,我是「云舒编程」,今天我们来聊聊# MySQL并发插入导致死锁。...该服务是一个老服务,至少有一年没有人改动过该接口,并且租户这个场景只支持创建和查询,其他能力都不支持。收到报警的一刻,内心充满了疑惑:"这也能死锁?"...死锁日志 先是到MySQL上获取了死锁日志: 关于插入意向锁,MySQL官网有如下解释说明: 结合死锁日志和官网说明大概推断死锁原因是: 事务一持有了某个记录的S型Next_LOCK锁(也就是S...也就是说在MySQL层产生了并发插入。 同时发现插入数据的代码居然是使用的for循环插入,而不是批量插入。...,不可能产生死锁啊 就在产生疑惑的时候,线上又出了一例死锁,查看死锁日志和请求日志。
mysql 查询表死锁语句 1.确定是否锁表 select * from information_schema.innodb_locks; 2.查询正在锁的事务 select * from information_schema.innodb_locks...; 3.查询等待锁的事务 select * from information_schema.innodb_lock_waits; 4.查询未提交的事务 select * from information_schema.innodb_trx...5.查询所有的线程 select * from information_schema.PROCESSLIST; 注:记录命令用于排查问题
因此,优化数据库插入性能是很有意义的。 修改mysql数据库配置: 0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似); 1....这里第二种SQL执行效率高的主要原因是合并后日志量(MySQL的binlog和innodb的事务让日志) 减少了,降低日志刷盘的数据量和频率,从而提高效率。...COMMIT; 使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内才进行真正插入处理操作。...mysql数据库查询优化方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...合理的索引设计要建立在对各种查询的分析和预测上。
读者反馈了一个死锁案例,比较有意思,上一篇文章讲了怎么通过调试源码来分析锁,今天再来分析一个死锁场景。...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 锁冲突。
index PRIMARY of table test.tt_copy trx id 1101588 lock_mode X locks rec but not gap 根据普通索引查找-锁加在普通索引和主键上...Update Update操作分解 Step 1:定位到 下一条满足查询条件的记录(查询过程,类似于Select/Delete) Step 2:删除当前定位到的记录(标记为删除状态) Step 3:...Update 无Unique key: 查询范围中的所有记录,LOCK_X + LOCK_REC_NOT_GAP 有Unique key: 查找满足条件的记录:查询范围内的所有记录, LOCK_X...在MySQL 中,以不同索引的过滤条件, 来操作相同的记录(Update/Delete ),很容易产生死 锁。...-何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道》
整理一些MySQL常用SQL语句:插入、更新、删除、查询、根据指定的列对结果集进行排序等。...为联合主键,并且分别对应于student表的sno和course表的cno。...插入 (1) 不指定列名 insert into student values (218004, '龙猫', '男', '23') 注意:如果不指定插入的列名,则value中的值要对应表中的每一列,若少列...(1) 连接查询 连接查询是数据库查询中最常用的一种查询语句,是指通过连接字段和连接条件连接多个表从而进行查询,连接查询又分为小类:等值连接、非等值连接 、内连接、外连接、自然连接、自身连接。 ...其中,UNION和UNION ALL都会做并集,但UNION会去除重复的记录。最后,MySQL不支持INTERSECT和EXCEPT。
1.死锁的概念 死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的。 对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。...发生死锁会返回ERROR:1213 错误提示,大部分的死锁InnoDB存储引擎本身可以侦测到,不需要人为进行干预。...注意: InnoDB存储引擎并不会回滚大部分的错误异常,像阻塞章节里面的例子,但是死锁例外,发现死锁后,InnoDB存储引擎会马上回滚一个事务,会返回1213错误。...这是因为uid字段是一个唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对uid字段进行修改。 那么为什么该S锁会失败呢?...通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样的循环等待,再加以分析,就可以逆向推断出循环等待的成因,也就是死锁形成的原因。
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务视图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源,也会产生死锁。...除非有外部因素介入才可能解除死锁。 死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。对于事务型的系统,这是无法避免的,所以应用程序在设计时必须考虑如何处理死锁。...大多数情况下只需要重新执行因死锁回滚的事务即可。
0 RETURN @@ERROR IF @intCountProperties = 0 SELECT '现在没有阻塞和死锁信息...intCounter BEGIN IF @spid = 0 SELECT '引起数据库死锁的是
UNIQUE COMMENT '学号', name VARCHAR(20) NOT NULL, qq VARCHAR(20) ); 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败的时候,如果我们想说我们要插入的这条记录无论主键或者是唯一键冲突都帮我完成插入...采用替换语句时如果主键或者唯一键没有冲突,则直接插入; 如果主键或者唯一键如果冲突,则删除后再插入。...-- 2 row affected: 表中有冲突数据,删除后重新插入 二、表的查询 语法: SELECT [DISTINCT] {* | {column [, column...2.3、分页筛选结果 -- MySQL数据库起始下标为 0 -- 从 0 开始,筛选 n 条结果 SELECT ......select avg(sal) as myavg from EMP group by deptno having myavg<2000; 在MySQL中,其实我们可以认为一切皆表。
上一篇博客我们知道的Mysql事务的隔离机制和实现,以及锁的详细解析 链接: 详解MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现,还有锁的详解 在我们使用锁的时候,有一个问题是需要注意和避免的...文章目录 锁的释放与阻塞 死锁的发生和检测 查看锁信息(日志) 死锁的避免 锁的释放与阻塞 回顾:锁什么时候释放? 事务结束(commit,rollback)﹔ 客户端连接断开。...[Err] 1205 - Lock wait timeout exceeded; try restarting transaction MySQL有一个参数来控制获取锁的等待时间,默认是50秒。...死锁的发生和检测 演示一下,开两个会话: 方便对时间线的提现,这里用图片,有兴趣的可以跟着模仿一下 栗子一: 栗子二: 在第一个事务中,检测到了死锁,马上退出了,第二个事务获得了锁...; 4、尽量使用索引访问数据,避免没有where条件的操作,避免锁表; 5、如果可以,大事务化成小事务; 6、使用等值查询而不是范围查询查询数据,命中记录,避免间隙锁对并发的影响。
在我们使用锁的时候,有一个问题是需要注意和避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。...[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 条件的操作,避免锁表; 如果可以,大事务化成小事务; 使用等值查询而不是范围查询查询数据,命中记录,避免间隙锁对并发的影响。
这里就介绍一下对MySQL死锁的理解,并提出一个基于审计日志分析死锁的方法。 一、死锁场景 我们创建一个最简单的死锁场景 1....CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `name` varchar(32) DEFAULT '', PRIMARY KEY (`id`) ); 2.插入数据...查询Id是683,是内部使用的一个Id。...死锁检测 MySQL的死锁检测是通过wait-for graph来实现的,它是一个有向图。...这部分后续再单独写下~ 六、如何避免死锁 从通用的角度讲,还是有许多的措施可以采用,避免死锁: 1.以固定的顺序访问表和行,从而以固定的顺序加锁,避免了交叉等待锁的情形。
如果insert或update用到了同样的索引也会造成死锁。...from table_a where id >=200) ON DUPLICATE KEY UPDATE a_id = values(a_id)//同样用到了table_a的id主键 所以会导致死锁...行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引。
中的锁 要想搞清 MySQL 中的死锁问题,那必然得先了解下 MySQL 锁知识!...MySQL如何加锁 锁的兼容互斥性 意向锁之间都互相兼容; 间隙锁之间都相互兼容,间隙锁和插入意向锁互斥,间隙锁目的是保护该间隙不被插入新数据; 行级读锁和行级读锁兼容,行级读锁和行级写锁互斥,行级写锁和行级写锁互斥..., next-key lock 会退化为间隙锁; 范围查询:范围查询需要访问到不满足条件的第一个值为止; insert语句: 普通insert情况,只加IX表锁和插入意向锁; 若其他线程并发插入同一索引位置时...RC 隔离级别下: 和 RR 类似,没有间隙锁和临键锁,查询过程中访问到的对象才会加锁,加锁的基本单位为记录锁,语句执行完就释放“不满足条件的行”的记录锁,“满足条件的行”的记录锁才在事务结束时才释放。...死锁 何为死锁 MySQL 中不同的锁之间存在兼容互斥关系,如果线程 1 中需要的锁资源 C 和线程 2 中拥有的锁资源 B 互斥,线程 1 就会阻塞等待线程 2 释放锁 B ;线程 2 需要的锁资源
UNIQUE KEY `uk_name` (`name`));INSERT INTO `t1` (`name`, `level`) VALUES ('A',0);# 出现问题的sql语句如下,并发情况下就会出现死锁...这样就可以非常轻松的复现死锁的问题了,步骤如下 开启两个 session,分别 begin session1 执行INSERT ignore INTO t1 (name, level) VALUES (...死锁日志如下: LATEST DETECTED DEADLOCK------------------------181208 23:00:52*** (1) TRANSACTION:TRANSACTION...starting index readmysql tables in use 1, locked 1LOCK WAIT 3 lock struct(s), heap size 376, 2 row lock(s)MySQL...sec starting index readmysql tables in use 1, locked 13 lock struct(s), heap size 376, 2 row lock(s)MySQL
插入 JSON 就是插入 json 格式的字符串,可以是对象的形式,也可以是数组的形式 mysql> INSERT INTO `lnmp` (category, tags) VALUES ('{"id...", "php.net"), JSON_ARRAY(1, 3, 5)); Query OK, 1 row affected (0.00 sec) 查看插入的数据 mysql> SELECT * FROM..., 对象型的查询同样可以通过 column->path mysql> SELECT * FROM lnmp WHERE category->'$.name' = 'lnmp.cn'; +----+-...,但作为条件这里其实没什么影响,-> 和 ->> 结果是一样的 mysql> SELECT * FROM lnmp WHERE category->>'$.name' = 'lnmp.cn'; +--.../doc/refman/5.7/en/json-search-functions.html 更新 JSON 如果是整个 json 更新的话,和插入时类似的。
作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。...本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....从死锁日志可以看到,事务 1(250489)和事务 2(250490)加锁发生死锁,都是因为二级索引 idx_i1 中的一条记录: /* i1 字段 */ 0: len 4; hex 80000005;...新插入的记录,会导致事务 1 和事务 2 原来对 的记录加的锁都需要拆分。 已经获得的锁,拆分是没有问题的。...事务 1(250489)和事务 2(250490)相互等待,就形成了死锁,过程如下: 事务 1 持有锁。 事务 2 等待获得事务 1 持有的锁。
,是因为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》
不可重复读:事务不可以读取未提交的数据,但是如果在另一个事务修改并提交了数据,此时可以读取到,同一事务两次相同的select结果可能会不同 幻读:事务不可以读取未提交的,也不能读取修改提交的,但是当另一个事务插入新数据提交后...,我本次事务有时会插入冲突,或者更新时更新的数据多了 加锁:强制串行执行,锁开销比较大 4.查看隔离级别: select @@global.tx_isolation, @@tx_isolation; |...| +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ 5.幻读问题 开启事务,查询数据...此时有另外的会话插入新数据 ? 再次查询新数据不会出现,但是插入时会报错 ?...6.mysql 死锁: 1.两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,导致恶性循环 2.解决这种问题,检测到死锁的循环依赖,立即返回一个错误 3.时间达到了锁等待超时限定,放弃锁请求
领取专属 10元无门槛券
手把手带您无忧上云