============================================================================

测试脚本:

表结构:
CREATE TABLE `t1` (
`i` int(11) NOT NULL DEFAULT '',
PRIMARY KEY (`i`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 会话1:
begin;
INSERT INTO t1 VALUES(1); 会话2:
begin;
INSERT INTO t1 VALUES(1); 会话3:
begin;
INSERT INTO t1 VALUES(1); 会话1执行ROLLBACK,会话2和会话3产生死锁

============================================================================

案例分析

案例分析:
当会话1未提交时,对插入的记录持有X排它锁,会话2和会话2检测到记录存在,但由于会话1处于未提交状态,不能判定会话2和会话3主键冲突, 会话2和会话3的执行成功与否取决于会话1提交还是回滚,因此会话2和会话3改为申请该记录的共享锁,由于记录上有X排他锁,因此会话2和会话3等待共享锁。 等会话1发生回滚,会话2和会话3会立即获得共享锁,然后会话2和会话3分别尝试插入,申请对记录持有X排他锁,因为对方会话持有S共享锁,申请X排他锁锁被阻塞,引发死锁检查并触发死锁。

参考: INSERT加锁规则

MySQL Lock--并发插入导致的死锁的更多相关文章

  1. MySQL 5.6.35 索引优化导致的死锁案例解析

    一.背景 随着公司业务的发展,商品库存从商品中心独立出来成为一个独立的系统,承接主站商品库存校验.订单库存扣减.售后库存释放等业务.在上线之前我们对于核心接口进行了压测,压测过程中出现了 MySQL ...

  2. Asp.net并发请求导致的数据重复插入问题

    前段时间工作中,有客户反应了系统中某类待办重复出现两次的情况.我核实了数据之后,分析认为是并发请求下导致的数据不一致性问题,并做了重现.其实这并不是一个需要频繁调用的功能,但是客户连续点击了两次,导致 ...

  3. MySQL(InnoDB)是如何处理死锁的

    MySQL(InnoDB)是如何处理死锁的 一.什么是死锁 官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁. 这个就好比你有一个人质,对方有一个人质,你们俩去 ...

  4. Mysql InnoDB 数据更新/删除导致锁表

    一. 如下对账表数据结构 create table t_cgw_ckjnl ( CNL_CODE ) default ' ' not null comment '通道编码', CNL_PLT_CD ) ...

  5. 分析SIX锁和锁分区导致的死锁

    什么是SIX锁? 官方文档锁模式中说到: 意向排他共享 (SIX):保护针对层次结构中某些(而并非所有)低层资源请求或获取的共享锁以及针对某些(而并非所有)低层资源请求或获取的意向排他锁. 顶级资源允 ...

  6. 性能调优之MYSQL高并发优化

    性能调优之MYSQL高并发优化   一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之 ...

  7. 关于web资金系统提现安全保护,防止极快的重复并发请求导致重复提现的解决思路

    关于WEB金融系统中的提现安全问题很多人没有深入思想,导致有漏洞,常常会遇到有些人遇到被攻击到导资金损失的麻烦,     其实要彻底解决重复并发请求 导致重复提现问题,是需要花点心思的,并没有看起来的 ...

  8. Transaction And Lock--唯一索引下INSERT导致的死锁

    背景: 曾经的一位同事问我:"数据库只有并发INSERT 操作,会造成死锁么?",我没有太多思考地回答"不会",但真的不会吗? 测试: --========== ...

  9. [MySQL] lock知识梳理

    MySQL Lock机制 INDEX: MySQL事务隔离级别 MVCC MySQL Lock类型 MySQL MDL CONTENT: 1. MySQL事务隔离级别 Read Uncommit RU ...

随机推荐

  1. hMailServer SSL 配置

    1.先安装 openssl , 调用如下命令,生成证书: openssl genrsa -des3 - openssl req -new -key alics.key -out alics.req o ...

  2. Docker小白从零入门到实战系列【二】

    1.安装好Centos 7 2.关闭SELINUX sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenfo ...

  3. 强化学习6-MC与TD的比较-实战

    # encoding:utf-8 import numpy as np import matplotlib.pylab as plt ''' 随机行走问题 0 - 1 - 2 - 3 - 4 - 5 ...

  4. 'autocomplete="off"'在Chrome中不起作用解决方案

    1.正确的姿势是: <input type="password" name="password" autocomplete="new-passw ...

  5. Hibernate项目的创建

    首先,我们需要知道,Hibernate是一个不需要建立在容器的基础上的一个框架,所以在java项目中同样可以运行. 为了证明,我们在这次程序的创建中,用JavaProject文件来实现Hibernat ...

  6. ES6 let和const 的相同点与区别

    相同点: 1. 一旦声明 值不能再改变,即不能重复声明. 2.不存在变量提升. 3.都存在暂时性死区. 不同点: 1.const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化 ...

  7. python --flask框架的搭建--(flask,python2,python3都可以运行)

    在linux搭建flask开发环境: (1)virtualenv -p python3 flasky                ---创建虚拟环境 (2)source flasky/bin/act ...

  8. Python学习笔记第十二周

    目录: 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令事务 索引 创建数据库 外键 增删改查表 权限 python 操作mysql  ORM sqla ...

  9. Django之模型层-了解ORM

    ORM(对象-关系-映射)简单使用 ORM实现了数据模型与数据库的解耦合,即数据模型的设计不需要指定特定的数据库,通过python代码可以直接对数据库实现增删改查 MySQL语法 #sql中的表 #创 ...

  10. 使用Git去管理修改

    Git跟踪的是修改而不是文件本身. 看下面一个例子 首先我们修改我们Git管理的git.txt文件 如下: 然后添加: 然后我们再去修改git.txt这个文件 然后直接提交到分支里如图: 也就是说我们 ...