返回顶部
首页 > 资讯 > 数据库 >浅谈MySQL 有哪些死锁场景
  • 372
分享到

浅谈MySQL 有哪些死锁场景

MySQL死锁场景MySQL死锁 2022-08-11 15:08:24 372人浏览 八月长安
摘要

目录1 环境准备2 同一张表下的死锁3 不同表下的死锁4 间隙锁下的死锁5 INSERT 语句的死锁首先一起来复习一下死锁的概念:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的

首先一起来复习一下死锁的概念:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

下面我们通过几个实验,来验证几种死锁场景。

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 同一张表下的死锁

session1

session2

begin;

begin;

select * from dl where a=1 for update;…1 row in set (0.00 sec)

select * from dl where a=2 for update;…1 row in set (0.00 sec)

select * from dl where a=2 for update;(等待)

 

(session2 提示死锁回滚后,sql1 成功返回结构)

select * from dl where a=1 for update;ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

commit;

commit;

session1 在等待 session2 释放 a=2 的行锁,而 session2 在等待 session1 释放 a=1 的行锁。两个 session 互相等待对方释放资源,就进入了死锁状态。

3 不同表下的死锁

session1

session2

begin;

begin;

select * from dl where a=1 for update; … 1 row in set (0.00 sec)

select * from dl_1 where a=1 for update; … 1 row in set (0.00 sec)

select * from dl_1 where a=1 for update; 等待

 

(session2 提示死锁回滚后,SQL1 成功返回结构)

select * from dl where a=1 for update; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

commit;

commit;

这个实验也是两个 session 互相等待对方释放资源,就进入了死锁状态。

4 间隙锁下的死锁

session1

session2

set session transaction_isolation='REPEATABLE-READ';

set session transaction_isolation='REPEATABLE-READ';

begin;

begin;

select * from dl where a=1 for update; … 1 row in set (0.00 sec)

select * from dl where a=2 for update; … 1 row in set (0.00 sec)

insert into dl(a,b,c) values (2,3,3); 等待

 

(session2 提示死锁回滚后,SQL1 成功返回结果)

insert into dl(a,b,c) values (1,4,4); ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

commit;

commit;

由于 RR 隔离级别下存在间隙锁,可以知道 SQL1 需要等待 a=2 获得的间隙锁,而 SQL2 需要等待 a=1 获得的间隙锁,两个 session 互相等待对方释放资源,就进入了死锁状态。

5 INSERT 语句的死锁

session1

session2

session3

begin;

  

insert into dl_insert(a,b,c) value (3,3,3);

  
 

insert into dl_insert(a,b,c) value (3,3,3);

insert into dl_insert(a,b,c) value (3,3,3);

rollback;

执行成功

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 死锁场景内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: 浅谈MySQL 有哪些死锁场景

本文链接: https://lsjlt.com/news/33652.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈MySQL 有哪些死锁场景
    目录1 环境准备2 同一张表下的死锁3 不同表下的死锁4 间隙锁下的死锁5 INSERT 语句的死锁首先一起来复习一下死锁的概念:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的...
    99+
    2022-08-11
    MySQL死锁场景 MySQL死锁
  • MySQL中有哪些加锁场景
    MySQL中有哪些加锁场景,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如下图所示,数据库的隔离等级,SQL 语句和当前数据库...
    99+
    2024-04-02
  • MySQL单表模拟锁的有哪些场景
    这篇文章主要介绍MySQL单表模拟锁的有哪些场景,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   在MySQL中对于并发,锁问题总是会有很多值得讨论的地方,但是通常来说...
    99+
    2024-04-02
  • mysql乐观锁使用的场景有哪些
    乐观锁通常在以下场景中应用: 并发读取:多个用户可以同时读取同一数据,不会产生冲突。 并发更新:多个用户可以同时读取同一数据,但只...
    99+
    2024-03-15
    mysql
  • mysql悲观锁的使用场景有哪些
    高并发更新操作:当有多个用户同时对同一行数据进行更新操作时,为了避免数据冲突和丢失,可以使用悲观锁来保证数据的一致性。 数据...
    99+
    2024-05-08
    mysql
  • 一个mysql死锁场景实例分析
    前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录。 涉及知识点:共享锁、排他锁、意向锁、间隙锁、插入意向锁、锁等待队列 场景 隔离级别:Repeatable-Rea...
    99+
    2024-04-02
  • redis锁的应用场景有哪些
    Redis锁的应用场景有以下几个:1. 分布式锁:在分布式系统中,多个节点需要共享某个资源时,使用Redis锁可以保证在同一时间只有...
    99+
    2023-08-12
    redis
  • 在Java并发场景中有哪些锁
    这篇文章主要介绍了在Java并发场景中有哪些锁,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。01.乐观锁 vs 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不...
    99+
    2023-06-16
  • java读写锁的使用场景有哪些
    当多个线程需要读取共享数据,但只有少数线程需要写入数据时,使用读写锁可以提高并发性能。 当对共享数据的读操作比写操作频繁时,...
    99+
    2024-04-03
    java
  • mysql中死锁的条件有哪些
    这期内容当中小编将会给大家带来有关mysql中死锁的条件有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、四个条件互斥条件:一个资源每次只能被一个进程使用。请求与保持条件:一个进程因请求资源而阻塞时...
    99+
    2023-06-15
  • java可重入锁的使用场景有哪些
    可重入锁是指同一个线程可以多次获得同一把锁,在释放锁之前需要释放相同次数的锁。可重入锁的使用场景包括:1. 递归函数:当一个递归函数...
    99+
    2023-09-11
    java
  • 浅谈MySql update会锁定哪些范围的数据
    目录1、背景2、前置知识2.1 数据库的隔离级别2.2 数据库版本2.3 数据库的存储引擎2.4 锁是加在记录上还是索引上2.5 update...where加锁的基本单位是2.6 行级锁3、测试数据...
    99+
    2022-06-24
    MySqlupdate锁定范围 MySqlupdate范围
  • Mysql索引失效场景有哪些
    这篇文章主要介绍Mysql索引失效场景有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据库及索引准备创建表结构为了逐项验证索引的使用情况,我们先准备一张表t_user:CREA...
    99+
    2024-04-02
  • mysql的mvcc应用场景有哪些
    MySQL的MVCC(多版本并发控制)主要应用于以下场景: 事务并发控制:MVCC能够保证事务的并发执行,使得多个事务可以同时读取...
    99+
    2024-04-24
    mysql MVCC
  • mysql中connection的应用场景有哪些
    在Web开发中,连接到数据库以执行查询和更新操作。 在服务器应用程序中,连接到数据库以处理用户请求并返回数据。 在数据分...
    99+
    2024-04-02
  • mysql和mongodb的使用场景有哪些
    MySQL适用于需要事务支持和复杂查询的应用场景,比如金融系统、电子商务平台等需要高度可靠性和数据一致性的应用。 Mongo...
    99+
    2024-04-09
    mysql mongodb
  • mysql中insert的应用场景有哪些
    在MySQL中,INSERT语句用于将新的数据行插入到表中。以下是一些INSERT语句的应用场景: 添加新数据:最常见的用法是向数...
    99+
    2024-03-06
    mysql
  • MySQL索引失效的场景有哪些
    以下是一些导致MySQL索引失效的常见场景: 使用不符合最左前缀原则的查询条件:当查询条件中的列不是索引的最左前缀时,MySQL...
    99+
    2024-04-09
    MySQL
  • mysql中div的应用场景有哪些
    在MySQL中,DIV函数通常用于做除法运算,将一个数字除以另一个数字,并返回结果。 应用场景包括: 求商:可以使用DIV函数进行...
    99+
    2024-05-10
    mysql
  • mysql幻读的使用场景有哪些
    当多个事务同时操作同一张表时,其中一个事务进行了插入或者删除操作,而另一个事务在此时进行查询操作,可能会出现幻读的情况。 当...
    99+
    2024-04-24
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作