死锁分析与解决
死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种相互等待的现象。
死锁产生的必要条件:
互斥:并发执行的事务为了进行必要的隔离保证执行正确,在事务结束前,需要对修改的数据库记录持锁,保证多个事务对相同数据库记录串行修改。
请求与保持:已经持有一个资源锁,等待另一个资源锁。
不剥夺:已经获得锁资源的事务,在执行前,不能强制剥夺,只能完成事务由自己释放。一般破坏该条件解除死锁,强制回滚。
循环等待:发生死锁时,必然存在一个事务,锁的环形链。调整sql顺序避免死锁。
MySQL锁:
加锁方式:
外部加锁:
共享锁(S):select * from table lock in share mode
排他锁(X):select * from table for update
内部加锁:
为了实现ACID特性,有数据库系统内部自动添加。
快照读:
Innodb实现多版本控制(MVCC),支持不加锁快照读。
select * from table where
保证同一个select结果集是一致的
不能保证同一事务内部,select语句与其他语句的数据一致性,如果需要,需要通过外部显示加锁。
当前读:
select...lock in share mode (共享读锁)
select...for update
update , delete , insert
当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。
例如,假设要update一条记录,但是另一个事务已经delete这条数据并且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录。
分析死锁:show engine innodb status
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/14307056.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)