关于并发insert操作发生deadlock这个情况,一直有很多争议,而且网上的帖子所有的例证和模拟其实不一定反映了真实的情况,例如:
https://www.percona.com/blog/2012/03/27/innodbs-gap-locks/
http://www.cnblogs.com/LBSer/p/5183300.html 
http://www.cnblogs.com/bamboos/p/3532150.html 
不少的类似例子应该来说其实不少有猜测和为了重现而重现的目的。
事实上开两个窗口,不做delete/update/select for update,仅select/insert是100%可以重现死锁场景的,也可以不出现。
start transaction A窗口select from X where x=1,不存在则insert X表记录1。假设x存在索引。
start transaction B窗口select from X where x=2,不存在则insert X表记录2。
这取决于当前使用的事务隔离级别,不同的事务隔离级别下有不同的行为。

A 会话
USE memdb;
SHOW VARIABLES LIKE '%autocommit%';
SET tx_isolation='SERIALIZABLE';
SHOW VARIABLES LIKE '%tx%';
START TRANSACTION;
SELECT * FROM `abcdefg` WHERE def=19 AND ghi=19 AND jkl=19;
-- 暂停,等B窗口前半部分执行了在执行下一部分
INSERT INTO `abcdefg`(abc,def,ghi,jkl,mnp) VALUES('19',19,19,19,1);
COMMIT;

 USE memdb;
SHOW VARIABLES LIKE '%autocommit%';
SET tx_isolation='SERIALIZABLE';
SHOW VARIABLES LIKE '%tx%';
START TRANSACTION;
SELECT * FROM `abcdefg` WHERE def=18 AND ghi=18 AND jkl=18;
-- 暂停,等A窗口前半部分执行了在执行下一部分
INSERT INTO `abcdefg`(abc,def,ghi,jkl,mnp) VALUES('18',18,18,18,1);
COMMIT;
 

原因在mysql的行锁实现主要分为记录锁、Gap锁、Next-key锁等。

 这三种锁定的范围不同,并且行锁不代表实现时锁定了所有已存在的符合where中明确说明的条件的行,还有可能包括隐式、不存在的记录。

因为 SERIALIZABLE使用的是GAP锁,所以,insert时>=当前索引的所有记录都被加上了S锁,故此问题发生 。

这也是我们遇到的,非常纯粹的只有insert操作的死锁的例子,对于使用oracle、sql server的开发人员来说时,遇到时有时候相当的不理解。

具体见各类锁的区别http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html。

mysql并发insert deadlock分析以及解决,无delete/update/for update的更多相关文章

  1. Mysql update后insert造成死锁原因分析及解决

    系统中出现死锁的日志如下: ) TRANSACTION: , ACTIVE sec inserting mysql tables , locked LOCK WAIT lock struct(s), ...

  2. 改进动态设置query cache导致额外锁开销的问题分析及解决方法-mysql 5.5 以上版本

    改进动态设置query cache导致额外锁开销的问题分析及解决方法 关键字:dynamic switch for query cache,  lock overhead for query cach ...

  3. 分析一个MySQL并发事务示例

    小结: 1. https://mp.weixin.qq.com/s/hdDl95a6ayVtCoEc3RiLwQ 分析一个MySQL并发事务示例 性能与架构 1月12日   MySQL实战45讲 从原 ...

  4. Mysql锁和死锁分析

    在MySQL中,行级锁并不是直接锁记录,而是锁索引.索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定 ...

  5. 2020重新出发,NOSQL,redis高并发系统的分析和设计

    高并发系统的分析和设计 任何系统都不是独立于业务进行开发的,真正的系统是为了实现业务而开发的,所以开发高并发网站抢购时,都应该先分析业务需求和实际的场景,在完善这些需求之后才能进入系统开发阶段. 没有 ...

  6. mysql卡顿问题查找和解决方法

    mysql卡顿问题查找和解决方法 版权一.所遇问题        写在前边的废话:今天面试阿里的时候问到过类似问题,以前做调优的时候都是现查现用,缺乏总结,面试时答得也不好,今天趁此机会做一个梳理,知 ...

  7. mybatis异常:Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}问题分析及解决

    转载自:http://blog.csdn.net/jackpk/article/details/44158701 mybatis异常:Improper inline parameter map for ...

  8. 分布式MySQL数据库TDSQL架构分析

    摘要:腾讯计费平台部为了解决基于内存的NoSQL解决方式HOLD平台在应对多种业务接入时的不足.结合团队在MySQL领域多年应用和优化经验,终于在MySQL存储引擎基础上,打造一套分布式SQL系统TD ...

  9. SQL Server 高并发Insert数据解析,实践

    在现实的生产环境中,有可能遇到高并发insert的应用.在此应用时由于堆表(Heap)和聚集表的结构不同导致在高并发的情形下insert效率不尽相同.接下来我会简单的以测试用例来简要说明.并举例说明如 ...

随机推荐

  1. hadoop的dfs工具类一个【原创】

    开始没搞定插件问题,就弄了个dsf操作类,后面搞定了插件问题,这玩意也就聊胜于无了,还是丢这里算了. 首先是一个配置,ztool.hadoop.properties hadoop.home.dir=G ...

  2. Raft论文的一些问题

    抛些问题出来,真正解释了这些问题才算理解了论文.:) 1. 什么是复制状态机 2. Raft vs Paxos 3. Raft的设计目标understandability,为达到设计目标在做设计时如何 ...

  3. MariaDB Galera Cluster 10.1 只支持 LINUX ?!

    MariaDB Galera Cluster  (MariaDB 10.1) 当前只支持:LINUX ! 参考: https://mariadb.com/kb/en/mariadb/getting-s ...

  4. [LeetCode] Longest Valid Parentheses 动态规划

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  5. SQL数据类型解释

    SQL数据类型解释 1.char.varchar.text.ntext.bigint.int.smallint.tinyint和bit的区别及数据库的数据类型电脑秘籍 2009-05-15 21:47 ...

  6. Failure is not fatal, but failure to change might be.

    Failure is not fatal, but failure to change might be. 失败不是致命的,但无法改变却可能是致命的.

  7. ArcGIS地图打印设置

    1.需求:客户自己开发的Engine程序,调用的是LayoutControl,需要连接大型绘图仪进行出图. 业务流程是先框选要打印的地图范围,该范围是自定义大小,框选完成之后进行预览,然后选择打印输出 ...

  8. Metatable和Metamethod

    Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说&quo ...

  9. es6新特性学习

    本文用来记录一下es6的新特性,持续更新.... es6在前端目前还不能大面试使用,包括移动端兼容也不好.不过在node中已可以使用其中96%的特性.也可使用一些插件将es6转化为es5,比如babl ...

  10. webapp开发之需要知道的css细节

    引言 首先说明一下,本文分享对象是涉世未深的移动开发者,至于有经验的开发者可以自行绕道. 说来惭愧,做了几年pc端的前端开发,很少接触到webapp的移动端开发.如今有机会参与webapp的开发,发现 ...