首页/数据/SQL 速查/并发失败重试模式
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

并发失败重试模式

对死锁与序列化失败的标准处理:捕获特定错误、回滚、短暂退避后重试;重试需要幂等设计配合。

SQL 速查数据更新于 2026-10-12

重试流程

重试流程
1. BEGIN
2. 业务 SQL(读取版本/条件更新)
3. COMMIT

// 失败处理
catch (1213 死锁 / 1205 锁超时 / 40001 序列化失败):
    ROLLBACK
    sleep(随机 10~200ms)
    重试(最多 N 次)

// 关键:重试块内不包含不可回滚的外部副作用(发消息、扣外部额度)
可重试错误MySQL 1213/1205;PostgreSQL 40001/40P01/55P03
幂等保证用唯一键/去重表/幂等键,使重试不产生重复副作用
退避指数退避 + 抖动,避免重试风暴

易错点

  • 在重试块里发了 MQ 消息/调用了外部接口:重试会导致重复执行,副作用必须移出或幂等化
  • 把重试次数设得过大且无退避:高并发下形成重试风暴,反而放大锁冲突

数据来源与参考

  • PostgreSQL Documentation · Serializable Isolation Level
  • MySQL 8.0 Reference Manual · Deadlocks
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌