mysql怎么模拟死锁_手把手教你分析Mysql死锁问题

前言

发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题

准备好数据环境

模拟死锁案发

分析死锁日志

分析死锁结果

环境准备

数据库隔离级别:

mysql> select @@tx_isolation;

+-----------------+

| @@tx_isolation |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set, 1 warning (0.00 sec)

自动提交关闭:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;

+--------------+

| @@autocommit |

+--------------+

| 0 |

+--------------+

1 row in set (0.00 sec)

表结构:

//id是自增主键,name是非唯一索引,balance普通字段

CREATE TABLE `account` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

`balance` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `idx_name` (`name`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

表中的数据:

84e4d7e0e7b4097b66113861e97ff9d4.png

模拟并发

开启两个终端模拟事务并发情况,执行顺序以及实验现象如下:

6dc2abf6838b5da4cee4c511fa98591b.png

1)事务A执行更新操作,更新成功

mysql> update account set balance =1000 where name ='Wei';

Query OK, 1 row affected (0.01 sec)

2)事务B执行更新操作,更新成功

mysql> update account set balance =1000 where name ='Eason';

Query OK, 1 row affected (0.01 sec)

3)事务A执行插入操作,陷入阻塞~

mysql> insert into account values(null,'Jay',100);

61426ad7288ddd60354b86c2d9349907.png

这时候可以用select * from information_schema.innodb_locks;查看锁情况:

ca54abcc4ca683367af823dd606bec11.png

4)事务B执行插入操作,插入成功,同时事务A的插入由阻塞变为死锁error。

mysql> insert into account values(null,'Yan',100);

Query OK, 1 row affected (0.01 sec)

7f690baab168b66e0d101d43ea71efdd.png

锁介绍

在分析死锁日志前,先做一下锁介绍,哈哈~

706c29f770776abe19035b4b4deb24d3.png

主要介绍一下兼容性以及锁模式类型的锁:

共享锁与排他锁

InnoDB 实现了标准的行级锁,包括两种:共享锁(简称 s 锁)、排它锁(简称 x 锁)。

共享锁(S锁):

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值