当前位置: 首页 > news >正文

Mysql并发时常见的死锁及解决方法

使用数据库时,有时会出现死锁。对于实际应用来说,就是出现系统卡顿。

死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。就是所谓的锁资源请求产生了回路现象,即死循环,此时称系统处于死锁状态或系统产生了死锁。常见的报错信息为“Deadlock found when trying to get lock...”。


上图中,很明显是右侧的四辆汽车造成了死锁。

死锁发生以后,只有部分或完全回滚其中一个事务,才能打破死锁。多数情况下只需要重新执行因死锁回滚的事务即可。下面我们通过一个实例来了解死锁是如何产生的。

例 1

为了方便读者阅读,操作之前我们先查询 tb_student 表的数据和表结构。

mysql> SELECT * FROM tb_student;
+----+------+------+------+------+
| id | name | age  | sex  | num  |
+----+------+------+------+------+
|  1 | 张三 |   31 | 男   |    4 |
|  2 | 李四 |   28 | 男   |    4 |
|  3 | 王五 |   13 | 女   |    4 |
|  4 | 张四 |   13 | 女   |    4 |
|  5 | 王四 |   15 | 男   |    4 |
|  6 | 赵六 |   12 | 女   |    4 |
+----+------+------+------+------+
6 rows in set (0.01 sec)mysql> DESC tb_student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(25) | NO   |     | NULL    |                |
| age   | int(11)     | YES  | MUL | NULL    |                |
| sex   | char(1)     | YES  |     | NULL    |                |
| num   | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

以下操作需要打开两个会话窗口,即下面所提到的 A窗口和 B窗口。

在 A窗口中执行以下命令:

mysql> BEGIN;
mysql> UPDATE tb_student SET num=5 WHERE age=13;
Query OK, 2 rows affected (0.04 sec)
Rows matched: 2  Changed: 2  Warnings: 0

紧接着在 B窗口中执行以下命令。由于 age 是索引字段,与 A窗口中更新的是不同行的数据,所以这时不会出现锁等待现象。

mysql> BEGIN;
mysql> UPDATE tb_student SET num=8 WHERE age=15;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后在 A窗口中,执行以下命令,这时就会出现锁等待现象了。

mysql> UPDATE tb_student SET num=10 WHERE age=15;

最后在 B窗口中,执行以下命令,这时会出现相互等待资源的现象,也就是死锁现象。

mysql> UPDATE tb_student SET num=12 WHERE age=13;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

我们可以通过 SHOW ENGINE INNODB STATUS 命令查看死锁的信息,运行结果如下(这里只展示了部分信息):

LATEST DETECTED DEADLOCK
------------------------
2020-08-24 16:22:23 0x3944
*** (1) TRANSACTION:
TRANSACTION 22656, ACTIVE 108 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 2
MySQL thread id 33, OS thread handle 8808, query id 1689 localhost ::1 root updating
UPDATE tb_student SET num=10 WHERE age=15
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 197 page no 8 n bits 80 index index_age of table `test`.`tb_student` trx id 22656 lock_mode X waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
0: len 4; hex 8000000f; asc     ;;
1: len 4; hex 80000005; asc     ;;
......

通过以上日志,我们就能确定造成死锁的事务和 SQL 语句。

死锁检测

InnoDB 的并发写操作会触发死锁,同时 InnoDB 也提供了死锁检测机制。通过设置 innodb_deadlock_detect 参数的值来控制是否打开死锁检测。

  • innodb_deadlock_detect = ON :默认值,打开死锁检测。数据库发生死锁时,系统会自动回滚其中的某一个事务,让其它事务可以继续执行。
  • innodb_deadlock_detect = OFF:关闭死锁检测。发生死锁时,系统会用锁等待来处理。


锁等待是指在事务过程中产生的锁,其它事务需要等待上一个事务释放锁,才能占用该资源。如果该事务一直不释放,就需要持续等待下去,直到超过了锁等待时间。当超过锁等待允许的最大时间,就会出现死锁,然后当前事务执行失败,自动执行回滚操作。

MySQL 通过 innodb_lock_wait_timeout 参数控制锁等待的时间,单位是秒。

mysql> SHOW VARIABLES LIKE '%innodb_lock_wait%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 120   |
+--------------------------+-------+
1 row in set, 1 warning (0.02 sec)

在实际应用中,我们要尽量防止锁等待现象的发生,下面介绍几种避免死锁的方法:

  1. 如果不同程序会并发存取多个表,或者涉及多行记录时,尽量约定以相同的顺序访问表,这样可以大大降低死锁的发生。
  2. 业务中要及时提交或者回滚事务,可减少死锁产生的概率。
  3. 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率。
  4. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁粒度,通过表锁定来减少死锁产生的概率(表级锁不会产生死锁)。

相关文章:

Mysql并发时常见的死锁及解决方法

使用数据库时,有时会出现死锁。对于实际应用来说,就是出现系统卡顿。 死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。就是所谓的锁资源请求产生了回路现象,即死循环,此时称系统处于…...

二十九、微服务案例完善(数据聚合、自动补全、数据同步)

目录 一、定义 二、分类 1、桶(Bucket)聚合: 2、度量(Metric)聚合: 3、管道聚合(Pipeline Aggregation): 4、注意: 参与聚合的字段类型必须是: 三、使用DSL实现聚合 聚合所必须的三要素: 聚合可配…...

vue 目录树的展开与关闭

目录 1、翻页方法中控制目录树节点的展开与关闭2、搜索目录树节点名称控制节点的展开与关闭 <el-tree:data"data_option"ref"tree":props"defaultProps"node-click"handleNodeClick":default-expanded-keys"needExpandedKeys&…...

【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI

一、Python环境编译 1、处理好venv环境 要生成正常的 requirements.txt 文件&#xff0c;我们就需要先将虚拟环境处理好 创建虚拟环境&#xff08;可选&#xff09;&#xff1a; 在项目目录中&#xff0c;你可以选择使用虚拟环境&#xff0c;这样你的项目依赖将被隔离在一个…...

力扣labuladong——一刷day55

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣951. 翻转等价二叉树二、力扣124. 二叉树中的最大路径和三、力扣112. 路径总和&#xff08;遍历&#xff09;四、力扣112. 路径总和&#xff08;分解&a…...

springboot实现验证码功能

转载自 : www.javaman.cn 1、编写工具类生成4位随机数 该工具类主要生成从0-9&#xff0c;a-z&#xff0c;A-Z范围内产生的4位随机数 /*** 产生4位随机字符串*/public static String getCheckCode() {String base "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn…...

内测分发平台是否支持应用的微服务化部署

内测分发平台的微服务化部署支持是现代应用开发和部署的一个重要特性。首先我们得知道什么是微服务化部署都有哪些关键功能&#xff0c;如何实施微服务化的部署。下文以我自己理解总结了几点。 图片来源:news.gulufenfa.com 微服务是一种基于独立运行的小型服务来构建应用程序…...

1140. 最短网络,prim算法,模板题

1140. 最短网络 - AcWing题库 农夫约翰被选为他们镇的镇长&#xff01; 他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。 约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给其他农场。 约翰的农场的编号是1&#xf…...

升级jdk17过程中,原来的jdk8下的webservice客户端怎样处理

背景&#xff1a;之前jdk8环境下&#xff0c;使用的cxf框架&#xff0c;而且是动态加载解析作为客户端。大家一直相处的很愉快。但是最近升级jdk17&#xff0c;发现cxf不好用了。网上百度&#xff0c;大部分都是说升级cxf版本&#xff0c;并且添加jaxb的相关依赖就可以了。但是…...

Verilog基本语法概述

一、概述 Verilog 是一种用于数字逻辑电路设计的硬件描述语言&#xff0c;可以用来进行数字电路的仿真验证、时序分析、逻辑综合。 既是一种 行为级&#xff08;可用于电路的功能描述&#xff09; 描述语言又是一种 结构性&#xff08;可用于元器件及其之间的连接&#xff09…...

论文阅读:C2VIR-SLAM: Centralized Collaborative Visual-Inertial-Range SLAM

前言 论文全程为C2VIR-SLAM: Centralized Collaborative Visual-Inertial-Range Simultaneous Localization and Mapping&#xff0c;是发表在MDPI drones&#xff08;二区&#xff0c;IF4.8&#xff09;上的一篇论文。这篇文章使用单目相机、惯性测量单元( IMU )和UWB设备作为…...

蓝桥杯刷题day01——字符串中的单词反转

题目描述 你在与一位习惯从右往左阅读的朋友发消息&#xff0c;他发出的文字顺序都与正常相反但单词内容正确&#xff0c;为了和他顺利交流你决定写一个转换程序&#xff0c;把他所发的消息 message 转换为正常语序。 注意&#xff1a;输入字符串 message 中可能会存在前导空…...

Python---引用变量与可变、非可变类型

引用变量 在大多数编程语言中&#xff0c;值的传递通常可以分为两种形式“ 值 传递 与 引用 传递”&#xff0c;但是在Python中变量的传递基本上都是引用传递。 变量在内存底层的存储形式 a 10 第一步&#xff1a;首先在计算机内存中创建一个数值10&#xff08;占用一块…...

GDOUCTF2023-Reverse WP

文章目录 [GDOUCTF 2023]Check_Your_Luck[GDOUCTF 2023]Tea[GDOUCTF 2023]easy_pyc[GDOUCTF 2023]doublegame[GDOUCTF 2023]L&#xff01;s&#xff01;[GDOUCTF 2023]润&#xff01;附 [GDOUCTF 2023]Check_Your_Luck 根据 if 使用z3约束求解器。 EXP&#xff1a; from z3 i…...

Day43力扣打卡

打卡记录 子数组的最小值之和&#xff08;乘法原理 单调栈&#xff09; 大佬的题解 class Solution:def sumSubarrayMins(self, arr: List[int]) -> int:n len(arr)# 左边界 left[i] 为左侧严格小于 arr[i] 的最近元素位置&#xff08;不存在时为 -1&#xff09;left, s…...

elementui的table合并列,三个一组

<el-table :span-method"objectSpanMethod" :cell-style"iCellStyle" :data"tableData" height"63vh" border style"width: 100%; margin-top: 6px"><el-table-column type"index" label"序号"…...

HarmonyOS-Service服务开发(一)

文章目录 创建新项目启动Serviceets获取service的bundleName DataAbility开发指导开发Data步骤创建Data 创建新项目 ServiceAbility开发指导 在config.json中也有配置出现 启动Service ets获取service的bundleName 项目的bundleName service的bundleName 这里serviceAbil…...

FLASK博客系列4——再谈路由

最近好像拖更有点久了。抱歉抱歉~ 今天我们继续来聊聊路由&#xff08;其实就是我上次偷懒剩下一点没讲完&#xff09;。 通过上次的文章&#xff0c;我们基本了解了Flask中的路由&#xff0c;是不是比较简单呢&#xff1f;别急&#xff0c;今天来点猛料。 一、路由之HTTP方法绑…...

sql之left join、right join、inner join的区别

sql之left join、right join、inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下&#xff1…...

京东秒杀之秒杀详情

1 编写前端页面&#xff08;商品详情&#xff09; <!DOCTYPE html> <head><title>商品详情</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><script type"text/javascript" src&…...

终极自动化:在CI中实现gumbo-parser文档生成的完整指南

终极自动化&#xff1a;在CI中实现gumbo-parser文档生成的完整指南 【免费下载链接】gumbo-parser An HTML5 parsing library in pure C99 项目地址: https://gitcode.com/gh_mirrors/gum/gumbo-parser gumbo-parser是一个纯C99编写的HTML5解析库&#xff0c;它能够高效…...

Chart.js项目实战:物流运输跟踪系统的终极可视化指南

Chart.js项目实战&#xff1a;物流运输跟踪系统的终极可视化指南 【免费下载链接】awesome A curated list of awesome Chart.js resources and libraries 项目地址: https://gitcode.com/GitHub_Trending/awesome/awesome 在当今快节奏的物流行业中&#xff0c;实时数据…...

Qwen-Image-2512像素艺术生成实战:从提示词设计到风格控制全流程

Qwen-Image-2512像素艺术生成实战&#xff1a;从提示词设计到风格控制全流程 1. 像素艺术创作新选择 最近在尝试用AI生成像素艺术时&#xff0c;发现了一个特别有意思的组合&#xff1a;Qwen-Image-2512模型加上专门优化的Pixel Art LoRA。这个搭配能生成质量惊人的像素风格图…...

从实战出发:掌握 dense_rank() 在 MySQL 与 Hive 中的高效应用

1. 为什么你需要掌握dense_rank()函数 记得去年我接手一个电商平台的用户活跃度分析项目&#xff0c;当时需要给平台上的百万用户做活跃度排名。最初我用的是简单的order by配合limit&#xff0c;结果发现当大量用户活跃度相同时&#xff0c;排名结果完全不符合业务需求——第1…...

从微信对话到数字遗产:WeChatMsg让您的聊天记忆永久留存

从微信对话到数字遗产&#xff1a;WeChatMsg让您的聊天记忆永久留存 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…...

Ventus GPGPU缓存一致性实战:RCC机制如何简化并行编程与硬件设计

Ventus GPGPU缓存一致性实战&#xff1a;RCC机制如何重构并行计算范式 1. 并行计算的缓存一致性困局 现代GPGPU架构正面临一个根本性矛盾&#xff1a;一方面需要更高的指令级并行度(ILP)来提升计算吞吐量&#xff0c;另一方面又不得不应对线程级并行(TLP)带来的缓存一致性问题。…...

DepMap(DepMap Portal)数据集说明

它是 Broad Institute 的 Cancer Dependency Map&#xff08;癌症依赖图谱&#xff09; 门户&#xff0c;核心目标是给研究者开放提供癌症细胞系的关键依赖性数据、分析工具和可视化工具&#xff0c;用来发现癌症的脆弱点和潜在治疗靶点。&#xff08;某个癌症在什么基因上有生…...

LaTeX公式转换Word终极方案:3步实现高效学术写作

LaTeX公式转换Word终极方案&#xff1a;3步实现高效学术写作 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation LaTeX2Word-Equation是一款专为学术…...

昇腾NPU上跑PyTorch模型太慢?试试这个优化器替换的‘作弊’技巧(附MobileNetV1实战)

昇腾NPU加速PyTorch训练&#xff1a;优化器替换实战与MobileNetV1性能翻倍指南 当你在昇腾AI处理器上运行PyTorch模型时&#xff0c;是否遇到过这样的场景&#xff1a;模型结构不复杂&#xff0c;数据加载也正常&#xff0c;但训练速度就是提不上去&#xff1f;这很可能是因为优…...

为什么你的Qwen-VL或Phi-3-vision在手机上崩了?3层Kernel级优化链(算子融合→KV Cache剪枝→动态分片)正在被头部厂商封测

第一章&#xff1a;多模态大模型端侧部署方案 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在端侧的高效部署正成为边缘智能落地的关键瓶颈。受限于算力、内存与功耗约束&#xff0c;传统云端推理范式难以满足实时性、隐私性与离线可用性需求。当前主流路径聚焦…...