温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据库Deadlock死锁常见原因有哪些

发布时间:2026-10-09 02:31:50 来源:亿速云 阅读:119 作者:小樊 栏目:数据库

数据库中的 Deadlock(死锁) 是指两个或多个事务在执行过程中,因互相持有对方所需的锁而陷入永久等待的状态。常见原因主要包括以下几类:


1. 事务并发访问相同资源且加锁顺序不一致

最常见原因。
如果事务 A 先锁表/行 X 再锁 Y,而事务 B 先锁 Y 再锁 X,就容易出现死锁。

事务A: lock(X) → lock(Y)
事务B: lock(Y) → lock(X)

✅ 解决思路:

  • 统一加锁顺序
  • 按主键或固定顺序访问表

2. 事务过大、持有锁时间过长

事务中包含:

  • 复杂计算
  • 远程调用
  • 人工操作(如等待用户输入)

导致锁长时间不释放,增加死锁概率。

✅ 解决思路:

  • 缩小事务范围
  • 避免事务中做非数据库操作

3. 缺乏合适的索引导致锁升级

没有索引时:

  • 本应锁单行 → 实际锁全表
  • 行锁升级为表锁

✅ 解决思路:

  • 建立合理索引
  • 避免 WHERE 条件走全表扫描

4. 高并发下的热点数据竞争

如:

  • 库存扣减
  • 账户余额更新
  • 计数器自增

多个事务同时修改同一行。

✅ 解决思路:

  • 业务层排队
  • 乐观锁(version)
  • 批量处理或合并更新

5. 显式锁使用不当

如:

  • SELECT ... FOR UPDATE
  • LOCK TABLE
  • 手动加锁未释放

✅ 解决思路:

  • 减少显式锁
  • 确保异常时回滚/释放锁

6. 外键约束导致的隐式加锁

更新父表时,数据库可能自动锁子表相关行。

✅ 解决思路:

  • 子表建外键索引
  • 控制父子表更新顺序

7. 不同事务隔离级别混用

如:

  • 一个事务 READ COMMITTED
  • 一个事务 SERIALIZABLE

可能导致锁行为不一致。


8. 数据库自身实现特性

不同数据库死锁表现不同:

  • MySQL InnoDB:行锁 + 死锁检测
  • Oracle:更依赖应用控制
  • SQL Server:锁粒度多样

常见预防总结

✅ 统一访问顺序
✅ 缩短事务
✅ 合理索引
✅ 降低锁粒度
✅ 使用死锁重试机制

如果你有具体数据库(MySQL / Oracle / PostgreSQL 等)或业务场景,我可以给更针对性的建议。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手