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

Msql-数据库死锁

实验案例

CREATE TABLE `t1_deadlock` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
`age` int(11) NOT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_age` (`age`) USING BTREE,
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Insert into t1_deadlock(id,name,age,address) values (1,'刘备',18,'蜀国');
Insert into t1_deadlock(id,name,age,address) values (2,'关羽',17,'蜀国');
Insert into t1_deadlock(id,name,age,address) values (3,'张飞',16,'蜀国');
Insert into t1_deadlock(id,name,age,address) values (4,'关羽',16,'蜀国');
Insert into t1_deadlock(id,name,age,address) values (5,'诸葛亮',35,'蜀国');
Insert into t1_deadlock(id,name,age,address) values (6,'曹孟德',32,'魏国');

案例1

TimeTransaction1Transaction2
T1begin;begin;
T2select * from t1_deadlock where id=1 for update;
T3delete from t1_deadlock where id=5;
T4update t1_deadlock set name=‘qqq’ where id=5;
T5delete from t1_deadlock where id=1;
T6死锁死锁
-- Session01
begin;
select * from t1_deadlock where id=1 for update;
update t1_deadlock set name='qqq' where id=5;
commit;
-- Session02
begin;
delete from t1_deadlock where id=5;
delete from t1_deadlock where id=1;
-- 死锁
commit;

在这里插入图片描述
上图紫色表示当前事务持有的锁,红色表示需要等待花获取的锁。我们按照表中是执行顺序,首先事务1给1这条记录加了记录锁,然后事务2给5这条记录加了记录锁,这个时候事务1又想取更新记录5就需要等待事务2提交释放5的记录锁,同样事务2想要删除记录为1的数据也需要等待事务1提交释放1记录的锁。这样事务1等待事务2,事务2等待事务1就造成了死锁。

SHOW ENGINE INNODB STATUS;

在这里插入图片描述

案例2
TimeTransaction1Transaction2
T1begin;begin;
T2delete from t2_deadlock where cnt=‘abc-130-sz’;
T3delete from t2_deadlock where cnt=‘abc-130-sz’;
T4insert into t2_deadlock (cnt) values (‘abc-130-sz’);
T5死锁死锁
CREATE TABLE `t2_deadlock` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cnt` varchar(32) DEFAULT NULL,PRIMARY KEY (`id`),
UNIQUE index `idx_cnt` (`cnt`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into t1_deadlock03(id,cnt) values (1,'abc-130-sz');
``
```sql
-- Session01
begin;
delete from t2_deadlock where cnt='abc-130-sz';
insert into t2_deadlock(cnt) values ('abc-130-sz');
commit;
-- Session02
begin;
delete from t2_deadlock where cnt='abc-130-sz';
commit;

在这里插入图片描述
事务1持有了这条记录的写锁,然后插入的时候由于需要先当前读最新的数据,所以需要加读锁,但是写锁是排它的就需要等待写锁释放,但是写锁只有在事务提价的时候才会释放,因此产生了死锁。

在这里插入图片描述

如何避免死锁

MySQL默认会主动探知死锁,并回滚某一个影响最小的事务。等另一事务执行完成之后,再重新执行该事务。

  1. 注意程序的逻辑:根本的原因是程序逻辑的顺序交叠,最常见的是交差更新
  2. 保持事务的轻量:越是轻量的事务,占有越少的锁资源,这样发生死锁的几率就越小
  3. 提高运行的速度:避免使用子查询,尽量使用主键等等
  4. 尽量快提交事务,减少持有锁的时间:越早提交事务,锁就越早释放

相关文章:

  • RabbitMQ详解
  • jsp课程管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 机器学习的整个流程
  • Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
  • LabVIEW双光子荧光显微成像系统开发
  • ChatGPT辅助编程,一次有益的尝试
  • Ubuntu文件系统结构
  • 【第三十五节】idea项目的创建以及setting和Project Structure的设置
  • 大语言模型微调数据集(2)
  • 水题中的稀奇古怪trick合集
  • 【VTKExamples::PolyData】第二十三期 InterpolateMeshOnGrid
  • SQL 注入 - http头注入之UA头注入探测
  • 海量数据处理商用短链接生成器平台 - 2
  • orin nx 安装paddlespeech记录
  • 2024年-视觉AI检测的面试题目总结
  • 【剑指offer】让抽象问题具体化
  • Babel配置的不完全指南
  • javascript面向对象之创建对象
  • JAVA之继承和多态
  • Lucene解析 - 基本概念
  • PV统计优化设计
  • Terraform入门 - 1. 安装Terraform
  • 对超线程几个不同角度的解释
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 京东美团研发面经
  • 警报:线上事故之CountDownLatch的威力
  • 前端之Sass/Scss实战笔记
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个JAVA程序员成长之路分享
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #Java第九次作业--输入输出流和文件操作
  • #预处理和函数的对比以及条件编译
  • (007)XHTML文档之标题——h1~h6
  • (9)STL算法之逆转旋转
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (一)Java算法:二分查找
  • .net framework profiles /.net framework 配置
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET实现之(自动更新)
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @KafkaListener注解详解(一)| 常用参数详解
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2016.7 test.5] T1
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [2023-年度总结]凡是过往,皆为序章
  • [C#]DataTable常用操作总结【转】
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [HDU 3555] Bomb [数位DP]
  • [HTML]HTML5实现可编辑表格