造成死锁的原因

news/2024/12/27 10:07:02/文章来源:https://www.cnblogs.com/dx5800/p/18568052

死锁是指两个或多个事务在竞争资源时形成的一种循环等待,导致它们都无法继续执行的情况。发生死锁的原因通常与资源的加锁顺序和并发操作有关。以下是死锁的详细分析:


1. 死锁的必要条件

根据死锁的四个必要条件(Coffman 条件),只要全部满足,就可能发生死锁:

条件 说明
互斥(Mutual Exclusion) 资源一次只能被一个事务持有(例如一个锁)。
持有并等待 事务持有资源时,同时等待其他事务持有的资源。
不可剥夺 资源只能由持有者主动释放,不能被强制剥夺。
循环等待 存在一个事务链,每个事务等待下一个事务持有的资源,最终形成循环。

只要避免这四个条件中的任何一个,死锁就不会发生。


2. 导致死锁的常见场景

以下是一些容易造成死锁的操作模式:

(1) 加锁顺序不一致

两个事务以不同的顺序请求资源,从而形成循环等待。

  • 事务 A:先锁定资源 X,再等待锁定资源 Y
  • 事务 B:先锁定资源 Y,再等待锁定资源 X

示例 SQL

-- 事务 A
START TRANSACTION;
SELECT * FROM table1 WHERE id = 1 FOR UPDATE;  -- 锁定资源 X
SELECT * FROM table2 WHERE id = 2 FOR UPDATE;  -- 等待资源 Y-- 事务 B
START TRANSACTION;
SELECT * FROM table2 WHERE id = 2 FOR UPDATE;  -- 锁定资源 Y
SELECT * FROM table1 WHERE id = 1 FOR UPDATE;  -- 等待资源 X

死锁原因:两个事务都在等待对方释放资源。


(2) 持有锁的时间过长

一个事务长时间占用锁资源,导致其他事务等待,最终可能形成循环等待。

  • 事务 A:长时间锁定资源。
  • 事务 B:等待资源的同时,锁定了另一个资源,阻塞其他事务。

(3) 事务隔离级别导致

在高隔离级别(如 Serializable)下,事务间的加锁机制更严格,容易导致死锁。


(4) 大量并发更新

多个事务对相同的资源进行更新,且同时加锁,形成资源争用。

示例 SQL

-- 事务 A
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 锁定记录 1
UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 等待记录 2-- 事务 B
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 2; -- 锁定记录 2
UPDATE accounts SET balance = balance + 100 WHERE id = 1; -- 等待记录 1

3. 如何避免死锁

(1) 统一加锁顺序

确保所有事务按照相同的顺序请求资源,避免循环等待。

-- 统一加锁顺序:先锁定 table1,再锁定 table2
START TRANSACTION;
SELECT * FROM table1 WHERE id = 1 FOR UPDATE;
SELECT * FROM table2 WHERE id = 2 FOR UPDATE;
COMMIT;

(2) 减少锁的持有时间

尽量缩短事务的执行时间,避免长时间持有锁。

-- 推荐做法:将事务逻辑尽量精简
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

(3) 设置合理的锁等待超时

设置锁等待超时值,当事务等待超过一定时间后自动回滚。

-- 设置锁等待超时时间(以秒为单位)
SET innodb_lock_wait_timeout = 10;

(4) 降低事务隔离级别

在允许的情况下,使用较低的隔离级别(如 Read CommittedRepeatable Read),减少加锁范围。


4. 死锁检测与处理

现代数据库(如 MySQL 的 InnoDB 引擎)有自动死锁检测机制,会在检测到死锁后自动回滚其中一个事务。

死锁错误示例

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

解决方法

  1. 捕获死锁异常并重试事务。
  2. 优化事务逻辑,避免死锁发生。

5. 总结

  • 死锁主要由循环等待和资源争用引起。
  • 遵循统一加锁顺序短事务优先的原则可以有效避免死锁。
  • 利用数据库的死锁检测机制可以快速恢复。

注意:该内容由由AIGC提供。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859702.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六边形图片展示

六边形图片展示 html代码展示<div class="boxF"><div class="boxS"><div class="boxT" :style="{background:url(+ $global.picCodePolice(item.faceImg) +)}"></div></div> </div>相关的css展示…

网站被挂木马,如何紧急处理并加强防护?

您好!当您的网站被挂木马时,需要立即采取一系列措施来清理木马文件,并防止未来的攻击。以下是详细的处理步骤和建议:立即停止传播有害信息:根据国家相关法律规定,网站主办者有责任确保网站不传播有害信息。一旦发现有害信息,必须在24小时内清除所有有害内容,并采取必要…

【GreatSQL优化器-08】statistics和index dives

【GreatSQL优化器-08】statistics和index dives 一、statistics和index_dives介绍 GreatSQL的优化器对于查询条件带有范围的情况,需要根据 mm tree 来估计该范围内大概有多少行,然后以此来计算cost。对于等号条件,给出了两种方法来估计对应行数--Statistics和index dives,前…

AS计划与AP排程如何革新供应链决策

过去大批量生产模式对计划排产、齐套配送、成本核算要求不高,人工计算和简单的MRP运算就已经满足生产计划需要。然而随着市场个性化需求的递增,市场的生产模式已经变为多品种、小批量、非标订单模式,这对企业的快速交付能力发起了挑战。maiAPS高级计划排程能解决企业哪些痛点…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版)

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版)VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 集成 Marvell AQC 网卡驱动定制版 (集成驱动版) VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe …

How to make iOS App fullscreen using SwiftUI views?

How to make iOS App fullscreen using SwiftUI views? 如何使用 SwiftUI 视图让 iOS App 全屏显示? iPad 全屏时钟 自开发 App,无广告,纯净版 🚀 SwiftUI x fullscreen API fullScreenCoverHow to make iOS App fullscreen using SwiftUI views?如何使用 SwiftUI 视图让…

CH585通过SPI驱动TFT屏

目录 链接: https://pan.baidu.com/s/1T8pmMlEmLrzyliPr_QLKfA?pwd=wch6 提取码: wch6 CH585的ram被设计为128K,是当前沁恒的蓝牙MCU中ram最大的一个,相比之前ram最大为32K的MCU,CH585在刷屏幕显存时方便了很多。 开篇链接中为CH585通过SPI驱动ST7789屏幕的参考代码,可用于…

Solon v3.0.5 发布!(Spring 生态可以退休了吗?)

新一代,面向全场景的 Java 应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。Solon 框架! 新一代,面向全场景的 Java 应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。追求: 更快、更小、更简单 提倡: 克制、高…

面试官:不会“不定高”虚拟列表,你在简历上面提他干嘛?

前言 很多同学将虚拟列表当做亮点写在简历上面,但是却不知道如何手写,那么这个就不是加分项而是减分项了。在上一篇文章欧阳教会你 如何实现一个定高虚拟列表 ,但是实际项目中更多的是不定高虚拟列表,这篇文章欧阳来教你不定高如何实现。PS:建议先看看欧阳的上一篇 如何实…

如何管控经销商:从无序到有序,打造共赢生态!

企业与经销商之间的合作关系可以描述为一种基于共同利益和目标的战略联盟。这种关系旨在通过双方的协同努力,实现产品在市场上的有效推广和销售,从而为企业带来利润增长,同时也为经销商提供商业机会和收益。如何管控经销商,是确保销售渠道顺畅、维护品牌形象和提升销售业绩…

安全无忧,内外网文件交换系统打造企业信息流转新通道!

内外网文件交换系统是指一种能够在组织的内部局域网(Intranet)和外部互联网(Internet)之间实现文件传输和共享的系统,广泛应用于各种需要跨网络传输文件的场景,这些场景主要围绕数据安全、传输效率和业务需求的满足。比如: 1、企业内部数据共享 在企业内部,不同团队或部…