浅谈MySQL 有哪些死锁场景
首先一起来复习一下死锁的概念:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
下面我们通过几个实验,来验证几种死锁场景。
1 环境准备 use martin;drop table if exists dl;
CREATE TABLE `dl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_c` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `dl_insert` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
PRIMARY KEY (`id`),
unique key `uniq_a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; insert into dl(a,b,c) values (1,1,1),(2,2,2);
drop table if exists dl_1;
create table dl_1 like dl;
insert into dl_1 select * from dl; 2 同一张表下的死锁
select * from dl where a=1 for update;ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
session1 在等待 session2 释放 a=2 的行锁,而 session2 在等待 session1 释放 a=1 的行锁。两个 session 互相等待对方释放资源,就进入了死锁状态。
3 不同表下的死锁select * from dl where a=1 for update; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
insert into dl(a,b,c) values (1,4,4);/* SQL2 */ ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
由于 RR 隔离级别下存在间隙锁,可以知道 SQL1 需要等待 a=2 获得的间隙锁,而 SQL2 需要等待 a=1 获得的间隙锁,两个 session 互相等待对方释放资源,就进入了死锁状态。
5 INSERT 语句的死锁ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
这里需要注意的是,a 字段有唯一索引。当 session1 执行完 insert 语句,会在索引 a=3 上加记录锁,当 session2 执行同样的 insert 语句时,唯一键冲突,加上读锁;同样 session3 也会加上读锁。
当 session1 回滚,session2 和 session3 都试图继续执行插入操作,都要加上写锁。此时两个 session 都要等待对方的行锁,因此出现了死锁。
一些死锁场景就介绍到这里,当然,也欢迎各位补充其他的一些死锁场景。
到此这篇关于浅谈MySQL 有哪些死锁场景的文章就介绍到这了,更多相关MySQL 死锁场景内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 浅谈MySQL 有哪些死锁场景
相关文章
- 【MySQL 中的悲观锁:深入解读】(悲观锁mysql)
- MySQL函数:提高数据管理能力(mysql函数的作用)
- 限制MySQL数据库连接数的限制问题(mysql数据库的连接数)
- 优化MySQL内存结构,提升性能(mysql内存结构)
- 如何快速关闭MySQL安全模式(关闭mysql安全模式)
- MySQL漏洞:它们来自哪里?(mysql漏洞有哪些)
- :MySQL,让数据存储更简单!(mysql夸库)
- MySQL中的重要数据类型有哪些?(mysql常用数据类型)
- ?自学MySQL:其难易究竟如何?(自学mysql难吗)
- 深入探究MySQL中的表结构(mysql查询有哪些表)
- 数据分析MySQL单表数据分析:洞察其中秘密(mysql单表记录)
- MySQL获取当前时间的方法(mysql取现在时间)
- MySQL应用场景概述。(mysql的应用场景)
- 实现MySQL高可用:架构挑战与解决方案(mysql的高可用架构)
- 探究MySQL的不同版本(mysql的版本有哪些)
- MySQL面试问题,有哪些值得重视的?(mysql 面试问题)
- MySQL下如何添加安全的Key(mysql 添加key)
- MySQL 中不可使用的保留字有哪些?(mysql的保留字)
- MySQL修改编码方式快速解决中文乱码问题(mysql中修改编码方式)
- MySQL中常用的编码有哪些(mysql中使用哪些编码)
- MySQL中SCN简单介绍和应用场景(mysql中scn)
- MySQL中AS在哪些场景下有用(mysql中as用在哪里)
- MySQL创建表示例快速掌握MYSQL基础操作(mysql中创建表的例子)
- MySQL的索引有哪些区别(mysql三种索引区别)
- MySQL数据库的应用场景简介(mysql一般用来干嘛)
- MySQL有哪些引擎浅析MySQL的存储引擎(mysql一共有几种引擎)
- MYSQL收费了 了解MySQL开源版的最新政策(mysql不再免费了吗)
- MySQL禁止文件写入操作(mysql不允许写到文件)