iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql出现死锁的原因及解决方案
  • 347
分享到

mysql出现死锁的原因及解决方案

2024-04-02 19:04:59 347人浏览 八月长安
摘要

本文主要给大家介绍Mysql出现死锁的原因及解决方案,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql出现死锁的原因及解决方案吧。mysql都

本文主要给大家介绍Mysql出现死的原因及解决方案,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql出现死锁的原因及解决方案吧。
  1. mysql都有什么锁

MySQL有三种锁的级别:页级、表级、行级,内存级(latch)。

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

算法

next KeyLocks锁,同时锁住记录(数据),并且锁住记录前面的Gap

Gap锁,不锁记录,仅仅记录前面的Gap

Recordlock锁(锁数据,不锁Gap)

所以其实 Next-KeyLocks=Gap锁+ Recordlock锁

  1. 什么情况下会造成死锁

所谓死锁 DeadLock 是指两个或两个以上的进程在执行过程中,
因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.
表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.

死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。

那么对应的解决死锁问题的关键就是:让不同的session加锁有次序

4,下面就简单来重现一下死锁:

死锁重现:
事务A:
root@test 16:01>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|           47274 |
+-----------------+
1 row in set (0.01 sec)

root@test 16:02>set autocommit =0;
Query OK, 0 rows affected (0.00 sec)

root@test 16:02>select * from t where id =1 for update;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

root@test 16:02>select * from t where id =2 for update;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
root@test 16:03>

事务B:
root@test 16:02>select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|           47272 |
+-----------------+
1 row in set (0.00 sec)

root@test 16:02>set autocommit =0;
Query OK, 0 rows affected (0.00 sec)

root@test 16:02>select * from t where id =2 for update;
+----+
| id |
+----+
|  2 |
+----+
1 row in set (0.00 sec)

root@test 16:03>select * from t where id =1 for update;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (5.53 sec)

===========================================

死锁信息:

LATEST DETECTED DEADLOCK

2018-10-19 16:03:14 7f9612b6d700
(1) TRANSACTION:
TRANSACTION 870600, ACTIVE 11 sec starting index read
mysql tables in use 1, locked 1
LOCK WaiT 3 lock struct(s), heap size 360, 2 row lock(s)
MySQL thread id 47272, OS thread handle 0x7f9612e38700, query id 1112421 127.0.0.1 root statistics
select  from t where id =1 for update
** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 330 page no 3 n bits 72 index PRIMARY of table test.t trx id 870600 lock_mode X locks rec but not gap waiting
(2) TRANSACTION:
TRANSACTION 870599, ACTIVE 22 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 360, 2 row lock(s)
MySQL thread id 47274, OS thread handle 0x7f9612b6d700, query id 1112422 127.0.0.1 root statistics
select * from t where id =2 for update
(2) HOLDS THE LOCK(S):
RECORD LOCKS space id 330 page no 3 n bits 72 index PRIMARY of table test.t trx id 870599 lock_mode X locks rec but not gap
(2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 330 page no 3 n bits 72 index PRIMARY of table test.t trx id 870599 lock_mode X locks rec but not gap waiting
*** WE ROLL BACK TRANSACTION (2)

5分析:
1,这上面是显示是事务产生死锁的sql并打印出相应所持和等待的锁
2,上面的信息并没有输出事务死锁之前的sql,所以可以直接堆出两个事务执行的sql使他们相互持有了对方等待的锁
3,造成死锁是必然的,慢sql和不合理的业务的逻辑是造成死锁过多的主要原因

重要的事情说三遍:优化sql,优化业务,优化逻辑

看完以上关于mysql出现死锁的原因及解决方案,很多读者朋友肯定多少有一定的了解,如需获取更多的行业知识信息 ,可以持续关注我们的数据库栏目的。

您可能感兴趣的文档:

--结束END--

本文标题: mysql出现死锁的原因及解决方案

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL死锁的原因及解决方法
    这篇文章主要介绍“MySQL死锁的原因及解决方法”,在日常操作中,相信很多人在MySQL死锁的原因及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL死锁的原因...
    99+
    2024-04-02
  • MySQL - 死锁的产生及解决方案
    MySQL - 死锁的产生及解决方案 1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件 2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁 3. 死锁排查4. 实例分析...
    99+
    2023-08-17
    mysql 数据库
  • 死锁之谜:探究数据库死锁的原因和解决方案
    数据库死锁是指两个或多个事务在同时执行过程中,由于互相等待对方释放锁而导致无限期等待的情况。这会导致事务无法继续执行,进而影响数据库的性能和可用性。 1. 数据库死锁的原因 数据库死锁通常是由以下原因引起的: 资源竞争: 当两个或多个...
    99+
    2024-02-05
    数据库死锁 事务 死锁检测 死锁预防 死锁恢复
  • MySQL中出现死锁的原因有哪些
    这篇文章给大家介绍MySQL中出现死锁的原因有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  MySQL死锁问题原因有哪些  1、MySQL常用存储引擎的锁机制  MyISAM和...
    99+
    2024-04-02
  • MySQL死锁产生的原因和解决方法
    前言 最近老顾经常碰到同事说,mysql又死锁了导致业务报错。今天我们就来聊聊死锁以及怎么解决 锁类型 mysql锁级别:页级、表级、行级 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:...
    99+
    2023-08-31
    mysql 数据库 java
  • sql死锁的原因及解决方法是什么
    SQL死锁是指在多个并发事务中,每个事务都在等待其他事务所持有的资源,导致所有事务都无法继续执行的状态。死锁的原因主要有以下几种:1...
    99+
    2023-08-16
    sql
  • 出现java.lang.NullPointerException的可能原因及解决方案
    出现 java.lang.NullPointerException 错误通常是因为代码中出现了一个空引用,即 null。当尝试对这个空引用进行操作时,就会出现 NullPointerException 错误。以下是可能导致该错误的几个原因:...
    99+
    2023-08-16
    java 空指针 nullpointer
  • mysql死锁的原因和解决方法是什么
    这篇文章主要讲解了“mysql死锁的原因和解决方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql死锁的原因和解决方法是什么”吧! ...
    99+
    2024-04-02
  • mysql锁表原因及解决
    mysql锁表原因及解决 问题如图 锁表发生原因 锁表发生在 insert、update、delete中;锁表的原理是数据库使用独占式锁机制,当执行上面的语句时,对表进行锁住,直到发生co...
    99+
    2023-09-01
    mysql 数据库 sql
  • MySQL出现乱码的原因及解决方法
    本篇内容主要讲解“MySQL出现乱码的原因及解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL出现乱码的原因及解决方法”吧!MySQL出现乱码的原...
    99+
    2024-04-02
  • 【mysql】mysql死锁问题解决方案
    mysql死锁问题解决方案 查询出是被哪个进程给锁住了为什么会产生死锁日志内容:日志解析:找到问题: 解决方案 查询出是被哪个进程给锁住了 执行sql: select ...
    99+
    2023-09-23
    mysql adb 数据库
  • Java中的死锁及其解决方案
    Java中的死锁及其解决方案 在Java中,锁是很常见的一个工具,常见的用法就是在高并发场景下保证线程安全,但是使用不当也会造成死锁,给我们带来一些不必要的麻烦,本文分析死锁及其产生原因,并作出相应的解决方案。 死锁产生的四个必要条件 ...
    99+
    2023-09-04
    java Powered by 金山文档
  • Oracle常见死锁发生的原因以及解决方法
    一.删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖。这里列举一个对同一个资源的争抢造成死锁的实例。 CREATE ...
    99+
    2024-04-02
  • mysql出现死锁如何解决
    mysql出现死锁的解决方法打开mysql服务器监控,终止系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解除出来。通过在表上建立一个聚集索引,实现解决死锁;从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以打破死锁状...
    99+
    2024-04-02
  • java.lang.StackOverflowError出现的原因及解决
    目录java.lang.StackOverflowError出现的原因深入理解java.lang.StackOverflowError栈的特点出现StackOverflowError...
    99+
    2024-04-02
  • mysql kill进程后出现killed死锁问题及解决
    目录mysql kill进程后出现killed死锁经常会出现这样的场景场景通过下列语句查询事务情况查看表锁信息总结mysql kill进程后出现killed死锁 经常会出现这样的场景 有一张3亿的表,现在要对这张表进行删...
    99+
    2024-01-29
    mysql kill进程 mysql出现killed死锁 mysql killed死锁
  • MySQL ERROR 1045出现的原因及怎么解决
    这篇文章主要介绍“MySQL ERROR 1045出现的原因及怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL ERROR 1045出现的原因...
    99+
    2023-07-02
  • MySQL查询出现1055错误的原因及解决方法
    目录报错内容如下报错原因解决办法总结当SQL语句查询报1055错误时的解决方法 报错内容如下 报错原因 1.SQL语句中使用了group by,并且不需要分组的字段没有加上any_value()函数 2.mysql数据...
    99+
    2023-05-19
    mysql查询报错1055 mysql报错1055 mysql错误1055
  • mysql死锁的解决方法
    mysql死锁的解决方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!MySQL有两种死锁处理方式:● 等待,直到超时(i...
    99+
    2024-04-02
  • Git拉取代码出错的原因及解决方案
    作为程序员,我们经常会使用 Git 进行代码版本管理。但是,在拉取 Git 代码时,有时会遇到出错的问题。下面就让我们来分析一下 Git 拉取代码出错的原因及解决方案。一、Git 拉取代码出错的原因1.远程库不存在在使用 git clone...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作