【mysql死锁】示例 和讨论 “SHOW ENGINE INNODB STATUS“

文章目录

  • mysql 死锁
    • 死锁演示
      • 表结构如下
    • 死锁查询mysql 详情
      • 命令行 SHOW ENGINE INNODB STATUS
    • 如果 两个事务都是按照先更新1 再更新2的顺序去做更新 会发生死锁么?
      • 验证一下
      • 所以 如果顺序是一致的 不会产生死锁 只会进行等待
    • 防止mysql 死锁的方式
      • 优化sql 自行顺序 按照统一的顺序进行执行,这样可以解决上面的死锁
      • 对上面的事务进行拆分,防止产生死锁。

mysql 死锁

死锁演示

表结构如下

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_name` varchar(64) NOT NULL DEFAULT '',`pass_word` varchar(64) NOT NULL DEFAULT '',PRIMARY KEY (`id`),UNIQUE KEY `idx_username` (`user_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- 两条数据
INSERT INTO `user` (`id`, `user_name`, `pass_word`) VALUES ('1', 'lock3', '6666');
INSERT INTO `user` (`id`, `user_name`, `pass_word`) VALUES ('2', 'lock4', '66667');

使用navicat 来做示例
在这里插入图片描述
开启两个命令行
在第一个命令行执行:

mysql> start transaction;
mysql> update user set user_name = 'updateu1' where id = 1;

在第二个命令行执行

mysql> start transaction;
mysql> update user set user_name = 'updateuser2' where id = 2;
mysql> update user set user_name = 'test1' where id = 1;
此时会出现等待的场景

在第一个命令行执行 会报错提示死锁

mysql> update user set user_name = 'test2' where id = 2;
1213 - Deadlock found when trying to get lock; try restarting transaction

死锁查询mysql 详情

命令行 SHOW ENGINE INNODB STATUS

在这里插入图片描述
我们复制出 Status信息进行查看
部分示例如下


=====================================
2024-06-30 14:02:46 0x6f0 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 36 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 64 srv_active, 0 srv_shutdown, 18676 srv_idle
srv_master_thread log flush and writes: 18740
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 3190
OS WAIT ARRAY INFO: signal count 4160
RW-shared spins 0, rounds 8156, OS waits 2615
RW-excl spins 0, rounds 22421, OS waits 53
RW-sx spins 6023, rounds 41833, OS waits 214
Spin rounds per wait: 8156.00 RW-shared, 22421.00 RW-excl, 6.95 RW-sx
------------------------
LATEST DETECTED DEADLOCK
------------------------
2024-06-30 14:00:12 0x4754
*** (1) TRANSACTION:
TRANSACTION 12766497, ACTIVE 31 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 25, OS thread handle 16428, query id 369 localhost 127.0.0.1 root updating
update user set user_name = 'test1' where id = 1
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 36378 page no 3 n bits 80 index PRIMARY of table `demo`.`user` trx id 12766497 lock_mode X locks rec but not gap waiting
Record lock, heap no 13 PHYSICAL RECORD: n_fields 5; compact format; info bits 00: len 4; hex 80000001; asc     ;;1: len 6; hex 000000c2cd20; asc       ;;2: len 7; hex 3d0000013d044a; asc =   = J;;3: len 8; hex 7570646174657531; asc updateu1;;4: len 4; hex 36363636; asc 6666;;*** (2) TRANSACTION:
TRANSACTION 12766496, ACTIVE 55 sec starting index read, thread declared inside InnoDB 5000
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 24, OS thread handle 18260, query id 370 localhost 127.0.0.1 root updating
update user set user_name = 'test2' where id = 2
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 36378 page no 3 n bits 80 index PRIMARY of table `demo`.`user` trx id 12766496 lock_mode X locks rec but not gap
Record lock, heap no 13 PHYSICAL RECORD: n_fields 5; compact format; info bits 00: len 4; hex 80000001; asc     ;;1: len 6; hex 000000c2cd20; asc       ;;2: len 7; hex 3d0000013d044a; asc =   = J;;3: len 8; hex 7570646174657531; asc updateu1;;4: len 4; hex 36363636; asc 6666;;*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 36378 page no 3 n bits 80 index PRIMARY of table `demo`.`user` trx id 12766496 lock_mode X locks rec but not gap waiting
Record lock, heap no 14 PHYSICAL RECORD: n_fields 5; compact format; info bits 00: len 4; hex 80000002; asc     ;;1: len 6; hex 000000c2cd21; asc      !;;2: len 7; hex 3e0000012a1f5e; asc >   * ^;;3: len 11; hex 7570646174657573657232; asc updateuser2;;4: len 5; hex 3636363637; asc 66667;;*** WE ROLL BACK TRANSACTION (2)
------------
TRANSACTIONS
------------
Trx id counter 12766504
Purge done for trx's n:o < 12766504 undo n:o < 0 state: running but idle
History list length 0

根据信息可以查看到 曾经发生锁死锁。有个一事务被回滚了。

如果 两个事务都是按照先更新1 再更新2的顺序去做更新 会发生死锁么?

验证一下

开启2个窗口

1.窗口1 执行:

mysql> start transaction;
mysql> update user set user_name = 'updateu1' where id = 1;
mysql> update user set user_name = 'updateuser2' where id = 2;
  1. 窗口2执行:
mysql> start transaction;
mysql> update user set user_name = 'updateu1' where id = 1;
执行到这里就开始进行等待了,在等待窗口1 释放锁 无法进行下一句sql的执行了
  1. 此时窗口1执行
commit;

窗口2才能自行第一句成功。

所以 如果顺序是一致的 不会产生死锁 只会进行等待

防止mysql 死锁的方式

优化sql 自行顺序 按照统一的顺序进行执行,这样可以解决上面的死锁

对上面的事务进行拆分,防止产生死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365652.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024超全盘点:5大文档加密系统,文档加密系统都有哪些功能

在众多文档加密系统中&#xff0c;以下是五款备受推崇的软件&#xff0c;其中包括安企神软件、加密精灵等&#xff0c;它们各自具备独特的优势和特点&#xff0c;以满足不同企业对数据安全的需求。 1. 安企神软件 特点与优势&#xff1a;安企神软件以其全面的数据保护功能见长…

C语言从入门到进阶(15万字总结)

前言&#xff1a; 《C语言从入门到进阶》这本书可是作者呕心沥血之作&#xff0c;建议零售价1元&#xff0c;当然这里开个玩笑。 本篇博客可是作者之前写的所有C语言笔记博客的集结&#xff0c;本篇博客不止有知识点&#xff0c;还有一部分代码练习。 有人可能会问&#xff…

基于STM32的简易智能家居设计

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…

idea启用多个环境

背景 在平常的后端开发中&#xff0c;需要与前端联调&#xff0c;比较方便的是让前端直接连自己的本地环境&#xff08;毕竟每次都要打包部署到测试环境实在是太麻烦了&#xff09;。但是这样子也有点不好&#xff0c;就是自己功能还没写好呢&#xff0c;结果前端连着自己的环…

微信小程序template模板引入

如图&#xff1a;temp.wxml是template引入的模板 在two.wxml中&#xff1a; import&#xff1a;是引入temp的页面让template中的内容显示出来在two页面中&#xff1b; include:是显示temp页面内容不在template包裹&#xff0c;template以外的view标签文字和不在view的文字让…

【Linux】进程信号_2

文章目录 八、进程信号1. 信号 未完待续 八、进程信号 1. 信号 除了可以使用 kill 命令和键盘来生成信号&#xff0c;我们也可以使用系统调用来生成信号。 kill函数可以对指定进程发送指定信号。 使用方法&#xff1a; int main(int argc, char *argv[]) {if (argc ! 3) {c…

6-14题连接 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例子2.6. 使用唯一标识码替换员工ID2.7- 产品销售分析 I2.8 - 进店却未进行过交易的顾客2.9 - 上升的温度2.10 - 每台机器的进程平均运行时间2.11- 员工奖金2.12-学生们参加各科测试的次数2.13-至少有5名直接下属的经理2.14 - 确认率 1. 相关知识点 left …

美国服务器租用详细介绍与租用流程

在数字化时代&#xff0c;服务器租用已成为许多企业和个人拓展业务、存储数据的重要选择。美国作为全球科技发展的前沿阵地&#xff0c;其服务器租用服务也备受瞩目。下面&#xff0c;我们将详细介绍美国服务器租用的相关知识及租用流程。 一、美国服务器租用简介 美国服务器租…

【K8s】专题六(3):Kubernetes 稳定性之自动扩缩容

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 一、基本介绍 在 Kubernetes 中&#xff0c;自动扩缩容是一种动态调整集群资源&#xff0c;以灵活…

前端vue项目升级nodejs后无法运行了

问题描述&#xff1a; 运行、打包都正常的vue项目&#xff0c;在将nodejs升级到v20.14.0后&#xff0c;均报错了&#xff1a; Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital envelope routines::initializ…

Java高级重点知识点-17-异常

文章目录 异常异常处理自定义异常 异常 指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。Java处 理异常的方式是中断处理。 异常体系 异常的根类是 java.lang.Throwable&#xff0c;&#xff0c;其下有两个子类&#xff1a;ja…

# Kafka_深入探秘者(5):kafka 分区

Kafka_深入探秘者&#xff08;5&#xff09;&#xff1a;kafka 分区 一、kafka 副本机制 1、Kafka 可以将主题划分为多个分区(Partition)&#xff0c;会根据分区规则选择把消息存储到哪个分区中&#xff0c;只要如果分区规则设置的合理&#xff0c;那么所有的消息将会被均匀的…

FastDFS部署

版本介绍 安装fastdfs共需要俩个安装包 fastdfs-5.05.tar.gz libfastcommon-1.0.7.tar.gz编译安装 libfastcommon tar -xvf libfastcommon-1.0.7.tar.gz cd libfastcommon-1.0.7 make.sh make.sh install 3. 设置软链接 libfastcommon.so默认安装到了/usr/lib64/libfastcommon.…

笔记-Python文件: .py、.ipynb、.pyi、.pyc、​.pyd

.py 最常见的Python代码文件后缀名&#xff0c;官方称Python源代码文件。 不用过多解释了~ .ipynb 这个还是比较常见的&#xff0c;.ipynb是Jupyter Notebook文件的扩展名&#xff0c;它代表"IPython Notebook"。 学过数据分析&#xff0c;机器学习&#xff0c;深度…

暑假假期规划 离不开宝藏待办计划管理工具

暑假来临&#xff0c;两个月的自由时间&#xff0c;如何过得充实而有意义&#xff0c;成了我最近思考的问题。毕竟&#xff0c;一个合理的假期规划&#xff0c;不仅能让我的假期生活更加丰富多彩&#xff0c;还能为新学期的到来做好充分的准备。 我幻想着在这个暑假里&#xf…

CSS|04 复合选择器伪类选择器属性选择器美化超链接

基本选择器&#xff1a;见上篇基本选择器 复合选择器选择器1,选择器2{属性:值;} 多元素选择器&#xff0c;同时匹配选择器1和选择器2&#xff0c;多个选择器之间用逗号分隔举例&#xff1a; p,h1,h2{margin:0px;}E F{属性:值;} 后代元素选择器&#xff0c;匹配所有属于E元素后…

塑造卓越企业家IP:多维度视角下的策略解析

在构建和塑造企业家IP的过程中&#xff0c;我们需要从多个维度进行考量&#xff0c;以确保个人品牌能够全面、立体地展现企业家的独特魅力和价值。以下是从不同角度探讨如何做好一个企业家IP的策略。 一、从个人特质出发 深入了解自我&#xff1a;企业家需要清晰地认识到自己的…

Laravel 谨慎使用Storage::append()

在 driver 为 local 时&#xff0c;Storage::append()在高并发下&#xff0c;会存在丢失数据问题&#xff0c;文件被覆写&#xff0c;而非尾部添加&#xff0c;如果明确是本地文件操作&#xff0c;像日志写入&#xff0c;建议使用 Illuminate\Filesystem\Filesystem或者php原生…

Rust: duckdb和polars读csv文件比较

duckdb在数据分析上&#xff0c;有非常多不错的特质。1、快&#xff1b;2、客户体验好&#xff0c;特别是可以同时批量读csv&#xff08;在一个目录下的csv等文件&#xff09;。polars的性能比pandas有非常多的超越。但背后的一些基于arrow的技术栈有很多相同之类。今天想比较一…

Python 算法交易实验75 QTV200后续想法梳理

说明 在第一步获取数据源&#xff0c;然后进入Mongo(第一个数据节点)开始&#xff0c;QTV200的数据流体系就开始动了。后续用多少时间完成不太好确定&#xff0c;短则数周&#xff0c;长则数月。毕竟有过第一版实验的基础&#xff0c;应该还是可以做到的。 下面就是天马行空&…