当前位置:网站首页>看三年的CRUD程序员如何解决数据库死锁的
看三年的CRUD程序员如何解决数据库死锁的
2022-08-08 13:55:00 【ikyrxbxfas】
问题出现
数据库死锁的问题不知道大家有没有见过,反正我干了三年多CRUD是第一次见。
接下来就一起来看看我遇到的这个死锁到底是怎样造成的?怎么解决的?
首先贴一下报错信息
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock;
try restarting transaction; SQL [];
Deadlock found when trying to get lock;
try restarting transaction;
nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock;
复制代码
当时的业务逻辑大概是这样的,如下图
现在给他简化一下
- 两个接口A和B,分别会开始事务A和B,一条数据行d
- 首先接口A会开启事务A去更新数据行d,拿到这条数据行的锁
- 通过RPC调用接口B,接口A等待接口B的响应返回才能进行事务的提交
- 接口B开启事务B去更新数据行d,但是数据行d的锁被事务A持有,事务B只能等待事务A释放锁才能进行数据的更新
这就是典型的相互等待造成的死锁,一个持有锁,一直无法释放;一个等待锁,一直获取不到。
那么,这个问题是如何解决的呢
经过跟同事及leader的沟通,大概给出三种方案
多线程
针对上面造成死锁的问题,可以将RPC的调用另起一个线程去执行;主线程去执行数据更新的操作。
- 首先接口A不需要等待接口B的返回就可以提交事务
- 然后就算接口B执行比较快:A事务还没有提交的时候,B接口就已经执行到更新数据的地方,这时候会堵塞;但是没关系,无论如何A事务都会提交事务,无非是快慢的问题
- 所以上述的死锁就会被解决
但是这种方式就是万无一失么,有什么问题呢?
- 多线程执行RPC调用,无法获取响应结果(当然多线程也能获取结果,但是获取结果的话,事务A还是无法提交造成死锁,没有意义)。
- 无法判断接口的成功与否,就丧失了事务失败回滚的意义
- 多线程能解决上述问题的死锁问题,但是稍微复杂一点的多表交叉更新还是会出问题,如下图
对事务进行细化处理
把接口A中的事务进行细化拆分:
- 将需要更新数据库的逻辑拆分成一个方法,并在方法调用的时候开启事务
- 当细分的方法执行成功后,再去进行RPC调用
这个解决了响应无法返回的问题,但还是那个问题,如果RPC调用失败了,更新的数据无法回滚。
顺序处理(也是最终的处理方案)
上述死锁问题的解决
- 先RPC调用接口
- 再进行更新操作
另外,顺序处理也是能解决复杂一点的多事务的多表更新死锁问题的。
首先我们得保证两个或多个开启事务的接口,对数据库数据的处理尽量避免交叉更新,应该按顺序更新。
比如对多线程处理的第三个问题解决,如图
其他方案
大伙们还有其他比较好的方案么,欢迎来沟通讨论啊。
边栏推荐
- 今日睡眠质量记录83分
- R语言ggplot2可视化:基于aes函数中的fill参数和shape参数自定义绘制分组折线图并添加数据点(散点)、设置可视化图像的主题为theme_gray
- 清华|GLM-130B:一个开放的双语预训练模型
- R语言使用位置索引筛选dataframe的数据列:筛选单个数据列、筛选多个数据列、列表表达式方法、矩阵式下标方法
- 项目动态|Apache Pulsar 2.10.1 版本介绍
- R语言ggplot2可视化:使用ggpubr包的ggtexttable函数可视化表格数据(直接绘制表格图或者在图像中添加表格数据)、使用tab_add_hline函数为表头添加横线并自定义线条宽度
- itk中图像2d-3d配准整理
- 代码随想录笔记_动态规划_322零钱兑换
- KD-SCFNet: More Accurate and Efficient Salient Object Detection Through Knowledge Distillation (ECCV2022)
- Thesis understanding: "Self-adaptive loss balanced Physics-informed neural networks"
猜你喜欢
Flink1.15源码阅读——StreamGraph流图
看到这个应用上下线方式,不禁感叹:优雅,太优雅了!
Thesis understanding: "Self-adaptive loss balanced Physics-informed neural networks"
如果Controller里有私有的方法,能成功访问吗?
【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态)
优刻得“失速”:营收转降,定向增发股东浮亏超三成
专访|360高瀚昭:ISC十年,360数字安全大脑能够“看见”什么?
小白大白读论文-关于EfficientNetV2论文的 疑问 与 总结
【个人总结】2022.8.7周结
Verilog语法基础HDL Bits训练 09
随机推荐
pip install xxx 出现 AttributeError: ‘tuple’ object has no attribute ‘read’ 错误
KD-SCFNet: More Accurate and Efficient Salient Object Detection Through Knowledge Distillation (ECCV2022)
poj2096 Collecting Bugs
【Redis】位图以及位图的使用场景(统计在线人数和用户在线状态)
零基础入门华为云数据库RDS【华为云至简致远】
小白大白读论文-关于EfficientNetV2论文的 疑问 与 总结
qtwebapp库的编译及简单使用
复盘:什么是秋招提前批?什么是普通秋招?都是招聘,为啥要设置这两个招聘时间段
客户案例 | 提高银行信用卡客户贡献率
leetcode 155. Min Stack最小栈(中等)
使用.NET简单实现一个Redis的高性能克隆版(三)
Implementation of FIR filter based on FPGA (1) - using fir1 function design
6.【opencv鼠标回调事件】
R语言ggplot2可视化:基于aes函数中的fill参数和shape参数自定义绘制分组折线图并添加数据点(散点)、设置可视化图像的主题为theme_gray
数据解析(XPath、BeautifulSoup、正则表达式、pyquery)
剑指 Offer 66. 构建乘积数组
keil5——安装教程附资源包
R语言patchwork包将多个ggplot2可视化结果组合起来、使用plot_annotation函数以及tag_level参数为组合图添加自定义编码序列(字符向量列表)
用 Antlr 重构脚本解释器
Flink1.15 组件RPC通信过程概览图