MySQL死锁的两个小案例

    最近花了些时间分析MySQL锁的内容,觉得越看越有意思。

我有个学习的习惯,有时候也不知道好还是不好,那就是喜欢直接上手练习,然后反过来练习理论。结果在学习锁的时候,感觉多多少少走了一些弯路,那就是对锁的基础的概念有一些混淆,虽然能够模拟出一些场景来,但是总是有一种隔靴搔痒的感觉,于是我就看了不少的博客,多多少少会有一些正面负面的影响,结果让我原本理解的地方又不大肯定了,所以这个时候捋一捋你学习的脉络就很重要,通过实践来得到结果,反推理论基础是好事,但是很多不明确的理解就需要通读官方文档了,这里的知识自成体系,看完以后有种得了病要到病除的感觉,想必这种解决方法是生效了。

  

    这部分内容还会继续细化,有些测试场景做了很多,通过模拟测试也算是理清了一些含糊不清的地方。

    文档比较大,我就列举出一部分的内容来,有很多还没有加入解读。我稍后会加入批注,然后把内容加入到小密圈里。

两个死锁的小例子:

死锁案例1

      比如自增列的死锁,一般的死锁得是4条DML语句互相牵制,我们可以做整合,简化,使得死锁的场景变得复杂起来。我们简单来模拟一下。   

create table t8

(c1 int auto_increment,

 c2 int default null,

primary key(c1),

unique key (c2)

)ENGINE=InnoDB  ;

#session1

Begin;

insert into t8 values(null,10);

#session2

insert into t8 values(null,10);

#session1

insert into t8 values(null,9);

    

死锁案例2

   比如我们难度升级,两条delete语句导致的死锁。

create Table: CREATE TABLE `d` (

  `i` int(11) NOT NULL DEFAULT '0',

  PRIMARY KEY (`i`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into d values(1);

##session1

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select *from d where i=1 lock in share mode;

+---+

| i |

+---+

| 1 |

+---+

1 row in set (0.00 sec)

##session2

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select *from d where i=1 lock in share mode;

+---+

| i |

+---+

| 1 |

+---+

1 row in set (0.00 sec)

#session1

mysql> delete from d where i=1;

Query OK, 1 row affected (10.80 sec)

##session2

mysql> delete from d where i=1;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

mysql>

小密圈的二维码可以参见:

时间: 2024-10-25 18:50:15

MySQL死锁的两个小案例的相关文章

session的两个小案例

版权声明:尊重博主原创文章,转载请注明出处哦~http://blog.csdn.net/eson_15/article/details/51262736 目录(?)[+]         学完了session,写两个小案例加深一下对session的巩固. 1. 用户登陆案例         登陆html页面提交后,将参数带给处理登陆的servlet,该servlet将获得登陆的用户名和密码,并将这些信息存入session中,另一个servlet在处理的时候,会先从session中拿到用户的信息,

JSP +MySQL实现网站的登录与注册小案例

为了练手,我就自己试着做了一个网站的登录与注册的小案例.由于没有做美化处理,所以界面并不是很好看. 网站实现的功能如下: 用户首次注册功能 用户登录功能 项目目录展示: 下面我将会分模块展示 注册模块 首先需要一个注册界面,如下register.jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <

&lt;转&gt;一个最不可思议的MySQL死锁分析

1 死锁问题背景 1 1.1 一个不可思议的死锁 1 1.1.1 初步分析 3 1.2 如何阅读死锁日志 3 2 死锁原因深入剖析 4 2.1 Delete操作的加锁逻辑 4 2.2 死锁预防策略 5 2.3 剖析死锁的成因 6 3 总结 7     死锁问题背景   做MySQL代码的深入分析也有些年头了,再加上自己10年左右的数据库内核研发经验,自认为对于MySQL/InnoDB的加锁实现了如指掌,正因如此,前段时间,还专门写了一篇洋洋洒洒的文章,专门分析MySQL的加锁实现细节:<MySQ

MySQL死锁问题分析及解决方法实例详解_Mysql

MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1.MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 2.各种锁特点 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低 行级锁:开销大,加锁慢;

一个MySQL死锁问题的反思

很早之前我写过几篇关于MySQL死锁的分析,比如 但是感觉不过瘾,而且分析的都是一些特定的场景,好像还缺少一些举一反三的感觉,所以今天就补上这一波. MySQL里的锁兼容列表大体是这样的关系,如果第一次看会有些晕,感觉抓不住重点,其实有一点小技巧. 首先InnoDB实现了两种类似的行锁,即S(共享锁)和X(排他锁),而InnoDB层面的表级意向锁有IS(意向共享锁)和IX9意向排他锁),意向锁之间是互相兼容的,这句话很重要,按照这个思路里面一半的内容就明确了.而另外一部分则是S和X的兼容性.带着

MySQL死锁问题实例分析及解决方法

MySQL死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助. 1.MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-level locking)或表级锁,默认为页面锁 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 2.各种锁特点 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低 行级锁

tip:关于range partition 用到多列的一个小案例

关于range partition 用到多列的一个小案例   作者:刘颖博 时间:2003-12-29 mail:liuyingbo@126.com,请指正   转载请注明出处及作者   1.实践 首先建分区表   create table simng_part ( LATN_ID NUMBER(4) not null, pname char(200), MON_ID NUMBER(2) not null ) PARTITION BY RANGE(LATN_ID,MON_ID) ( PARTIT

struts2+spring+mybatis整合小案例

最近学习ssm框架,模仿别人做了一个小案例 当然途中也遇到了蛮多的问题.借此机会.记录一下自己的过程 struts2+spring+mybatis的整合过程 1.说明: 个人采用的是deepin操作系统(深度linux)+Intellij Idea(相对与myeclipse我还是更喜欢idea 可能因为更智能)+tomcat7. 当然在windows下没什么不同,具体操作过程很相似. 2.案例环境搭建 注:项目结构图 2.1准备工作 - 新建idea项目 - 在web/web-inf下新建cla

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的好用,今天我们为了博客的保质保量,也就不分开写,我们直接拿比较火的Gson和Fast-json来使用,末尾在进行一些分析 Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 一.各有千秋 两大解析库的东家都是巨头,一个来自于Google官方,一个来自阿里巴巴,我们这