当前位置:网站首页>MySQ死锁
MySQ死锁
2022-07-30 03:25:00 【Leon_Jinhai_Sun】
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。
产生条件:
1.两个或以上事务
2.每个事务都已经持有锁并且申请新的锁
3.锁资源同时只能被同一个事务持有或者不兼容
4.事务之间因为持有锁和申请锁导致彼此循环等待
事务1和事务2分别为id=1,id=2的行设置了行锁。然后事务1在等待事务2释放id=2的行锁,而事务2在等待事务1释放id=1的行锁。 事务1和事务2在互 相等待对方的资源释放,就是进入了死锁状态。
解决死锁的方式:
1.设置超时时间。当一个事务等待时间到达阈值时,就回滚,另外的事务继续进行。缺点是等待时间过长往往无法接受,时间过短又容易误伤到普通的锁等待。
2.使用死锁检测处理。发现死锁后,主动回滚死锁链条中的某一个事务(将持有最少行级排他锁的事务进行回滚/最小undo量),让其他事务得以继续执行。
死锁检测的原理是构建一个以事务为顶点,锁为边的有向图,判断有向图是否存在环,存在即死锁。
缺点是每个新的被阻塞线程都要判断是不是因为它的加入导致了死锁,这比较费时。
解决思路:
1.关闭死锁检测。
2.控制并发访问量。比如同一行同时最多只有10个线程在更新,那么死锁检测的成本很低,就不会出现这个问题。
如何避免死锁?
1.合理设置索引,使SQL尽可能通过索引定位更少的行。
2.调整SQL执行顺序,避免长时间持有锁的SQL在事务前面。
3.尽量把大事务拆分成小事务处理。
4.并发度高的系统中不要显式加锁。
5.降低隔离级别。
边栏推荐
猜你喜欢
随机推荐
26 basic models in 6 categories that operators must master
Nuxt3学习
淘宝/天猫获得淘宝店铺详情 API
YOLOv7的一些理解
华宝新能通过注册:拟募资近7亿 营收增加利润反而下降
QT基础第三天(3)widget,dialog和mainwindow
The relationship between the number of Oracle processes and the number of sessions
The most important transport layer
基于全志D1-H和XR806的名贵植物监控装置
JUC(八):synchronized小练习
开放地址法哈希实现——线性探测法
WPF 学习笔记《WPF布局基础》
nSoftware.PowerShell.Server.2020
[JS] embedded iframe page usage
Nacos实现高可用
【JS】iframe 嵌入页面用法
一本通1922——乒乓球
JUC(六):synchronized
Software testing interview questions and answer analysis, the strongest version in 2022
JUC (8) : synchronized little exercise









