MySQL死锁的两个小案例

本文通过实际操作模拟了两种MySQL死锁场景,并详细记录了测试过程。一种是自增列引起的死锁,另一种是由两条DELETE语句导致的死锁。通过对这些场景的深入研究,有助于理解MySQL中死锁产生的原因及解决办法。

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

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

   302f0650-f6a4-4a42-b6fa-da90c0fa33e1.png

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

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

两个死锁的小例子:

死锁案例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>


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值