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

news2025/1/20 10:58:44

文章目录

  • 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 0
 0: 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 0
 0: 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 0
 0: 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.coloradmin.cn/o/1880764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

Step-by-Step Diffusion: An Elementary Tutorial 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0 前言 1 扩散的基础知识 1.1 高斯扩散 1.2 抽象中的扩散 1.3 离散化 2 随机采样…

React 打包时如何关闭源代码混淆

React 开发中&#xff0c;使用 npm build 命令进行生产代码打包&#xff0c;为了压缩代码并尽量保证代码的安全性&#xff0c;React 打包时会代码进行压缩和混淆&#xff0c;但是有时我们需要 debug 生产环境的源代码&#xff0c;例如当我们调试 SSR 的项目时&#xff0c;需要禁…

业务模型扩展字段存储

构建业务模型时&#xff0c;通常模型会设置扩展信息&#xff0c;存储上一般使用JSON格式存储到db中。JSON虽然有较好的扩展性&#xff0c;但并没有结构化存储的类型和非空等约束&#xff0c;且强依赖代码中写入/读取时进行序列化/反序列化操作&#xff0c; 当扩展信息结构简单且…

SpringMVC(1)——入门程序+流程分析

MVC都是哪三层&#xff1f;在Spring里面分别对应什么&#xff1f;SpringMVC的架构是什么&#xff1f; 我们使用Spring开发JavaWeb项目&#xff0c;一般都是BS架构&#xff0c;也就是Browser&#xff08;浏览器&#xff09;-Server&#xff08;服务器&#xff09;架构 这种架构…

JVM(12):虚拟机性能分析和故障解决工具之JConsole

1 JConsole作用 查看Java应用程序的运行概况&#xff0c;监视垃圾收集器管理的虚拟机内存(堆和元空间)的变化趋势&#xff0c;以及监控程序内的线程。 2 使用说明 代码如下&#xff1a; package com.example.demo;import java.io.IOException; import java.util.ArrayList; …

AliyunOS安装Node.js

方法1&#xff1a;dnf软件包安装工具自动安装 最方便的安装方式是通过系统的dnf工具&#xff0c;我测试使用的AliyunOS的版本是Alibaba Cloud Linux 3.2104&#xff0c;具体流程如下&#xff1a; dnf module list nodejs #列出服务器中可以使用的所有nodejs版本确定下来希望安…

[Ant Design Vue 树控件Tree]内存溢出报错

使用ant design vue控件时发现报错&#xff0c;但是数据展示时没有问题的&#xff1b; 具体报错信息&#xff1a;Maximum call stack size exceeded 经排查&#xff0c;是我的目录下数据过多&#xff0c;差不多有小一万的数据&#xff1b; 查看官方文档&#xff0c;使用虚拟滚…

50-4 内网信息收集 - 本机信息收集

一、内网信息收集 内网信息收集可以从以下几个方面进行:本机信息收集、域内信息收集、内网资源探测等。通过这些步骤,我们可以全面了解当前主机的角色和所处内网的拓扑结构,从而选择更合适、更精准的渗透方案。 二、本机基础信息收集 在本机基础信息收集阶段,可以执行以下…

vue+canvas画布实现网页签名效果

1、签名自定义组件代码示例&#xff1a; qianMing.vue <template><!-- 容器&#xff0c;包含画布和清除按钮 --><div class"signature-pad-container"><!-- 画布元素&#xff0c;用于用户签名 --><canvasref"canvas" <!--…

后劳动经济学(PLE):AI时代的工作未来

引言 随着人工智能&#xff08;AI&#xff09;和自动化技术的飞速发展&#xff0c;我们迎来了一个新的经济范式——后劳动经济学&#xff08;PLE&#xff09;。这一概念主要讨论在AI和自动化技术超越人类能力的关键领域后&#xff0c;机器将不可避免地在许多经济活动中取代人类…

昇思25天学习打卡营第12天|ShuffleNet图像分类

1. 学习内容复盘 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&a…

恢复策略(上)-撤销事务(UNDO)、重做事务(REDO)

一、引言 利用前面所建立的冗余数据&#xff0c;即日志和数据库备份&#xff0c;要将数据库从一个不一致的错误状态恢复到一个一致性状态&#xff0c;还需要相关的恢复策略&#xff0c;不同DBMS的事务处理机制所采用的缓冲区管理策略可能不同&#xff0c;发生故障后的数据库不…

LeetCode刷题之HOT100之最大正方形

今天下起了暴雨&#xff0c;本以为下午就可以结束的答辩又因为老师开会被推迟。研三的学长走了后我们开始了0元购&#xff0c;收获颇丰哈哈&#xff0c;做个题 1、题目描述 2、算法分析 给定一个矩形&#xff0c;要求最大正方形。第一次见这种题目哈 2024 6/30 嘿嘿&#xff…

一区算法MPA|海洋捕食者算法原理及其代码实现(Matlab/Python))

Matlab/Python&#xff1a; 本文KAU将介绍一个2020年发表在1区期刊ESWA上的优化算法——海洋捕食者算法 (Marine Predators Algorithm&#xff0c;MPA)[1] 该算法由Faramarzi等于2020年提出&#xff0c;其灵感来源于海洋捕食者之间不同的觅食策略、最佳相遇概率策略、海洋记…

C++异常智能指针

目录 异常 异常的定义 异常的抛出和捕获 异常安全问题 异常的规范 智能指针 RAII思想 使用RAII的例子 智能指针 文件资源 在linux中管理锁资源 智能指针发展历程 auto_ptr unique_ptr shared_ptr 异常 异常的定义 异常是一种处理运行时错误的机制&#xff0c;它…

20240629在飞凌开发板OK3588-C上使用Rockchip原厂的SDK跑通I2C扩展GPIO芯片TCA6424ARGJRR

20240629在飞凌开发板OK3588-C上使用Rockchip原厂的SDK跑通I2C扩展GPIO芯片TCA6424ARGJRR 2024/6/29 18:02 1、替换DTS了&#xff1a; Z:\repo_RK3588_Buildroot20240508\kernel\arch\arm64\boot\dts\rockchip viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot2024…

Jedis、Lettuce、RedisTemplate连接中间件

jedis就像jdbc一样&#xff0c;用于两个端直接的连接。 1.创建Spring项目 这里不过多赘述... 2.导入连接工具jedis 在pom文件中导入jedis的依赖。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…

【雷达原理】雷达测角原理及实现方法

目录 一、雷达测角原理1.1 测角研究历史和现状1.2 测角方法总结1.3 3DFFT测角1.3.1 基本原理1.2.2 测角性能 二、MATLAB仿真案例参考文献 一、雷达测角原理 1.1 测角研究历史和现状 &#xff08;1&#xff09;早期采用窄波束对准目标&#xff0c;目标的角度对应于天线的角度读…

Unity3D 转换微信小游戏指引 01

Unity3D 转换微信小游戏指引系列&#xff08;第一期&#xff09; 搭建环境 安装 WebGL 模块 首先&#xff0c;Unity 要安装WebGL Build Support模块。 在 Hub 找到安装的引擎&#xff0c;点击设置按钮&#xff0c;点击Add modules添加模块。 勾选WebGL Build Support&#…

股指期权交割日期是什么时候?在每个月几号?

今天带你了解股指期权交割日期是什么时候&#xff1f;在每个月几号&#xff1f;期权交割日是指合约到期之日&#xff0c;即投资者需要履行买卖合约的义务。 股指期权的交割日期通常是期权合约到期日的第三个星期五。如果这一天是公共假日&#xff0c;则交割日可能会提前到前一…