
1) 【一句话结论】秒杀场景的分布式事务设计,核心是通过协调者(如Seata或TCC)管理订单、库存、支付等参与者,采用补偿事务模式(如Seata AT或TCC),结合幂等性检查与超时重试机制,确保业务一致性。推荐优先考虑Seata AT模式,兼顾性能与正确性,TCC适用于对性能要求极高的场景,需设计复杂补偿逻辑。
2) 【原理/概念讲解】分布式事务解决跨服务数据一致性问题,核心是协调者(Transaction Coordinator, TC)与参与者(如订单、库存、支付服务)协作。协调者创建全局事务,管理事务状态(如PREPARE、COMMIT、ROLLBACK),参与者执行本地事务。类比:餐厅点餐流程,点餐(订单)、拿餐(库存扣减)、结账(支付)需经理(协调者)确保“要么都完成,要么都取消”,避免“已点餐但没拿餐”或“已拿餐但未结账”的异常状态。关键点:协调者控制全局提交/回滚,参与者返回结果,协调者根据结果决定事务最终状态。
3) 【对比与适用场景】
| 方案 | 定义 | 核心思想 | 使用场景 | 优缺点 |
|---|---|---|---|---|
| TCC | 基于补偿事务的分布式事务 | 三个阶段:Try(预检查)、Confirm(执行)、Cancel(补偿) | 对性能要求高,业务逻辑简单(如秒杀、下单) | 优点:无阻塞,性能高;缺点:补偿逻辑复杂,需保证补偿能恢复原状 |
| Seata AT模式 | 基于数据库事务的分布式事务 | 两个阶段:预提交(Try)、提交(Confirm),回滚(Rollback) | 业务逻辑复杂,需与数据库事务结合 | 优点:对业务无侵入,补偿由框架自动处理;缺点:预提交可能阻塞,性能受数据库影响 |
| Saga模式 | 基于消息异步协调的分布式事务 | 分为多个步骤,每个步骤执行本地事务,失败则通过补偿步骤恢复 | 业务逻辑复杂、需异步协调(如订单、物流、支付多步骤流程) | 优点:异步处理,减少阻塞;缺点:需保证补偿步骤的幂等性,可能存在最终一致性延迟 |
4) 【示例】(秒杀请求流程,含幂等性检查与补偿逻辑)
// 秒杀请求流程(Seata AT模式,含幂等性检查)
秒杀请求(用户ID, 商品ID, 数量) {
开始全局事务(事务ID)
// 订单服务:Try阶段(创建订单,本地事务)
订单服务.创建订单(事务ID, 用户ID, 商品ID, 数量) → 成功
// 幂等性检查:通过订单号检查是否已存在
if (订单服务.检查订单存在(事务ID, 订单号) == "已存在") {
return
}
// 库存服务:Try阶段(扣减库存,本地事务)
库存服务.扣减库存(事务ID, 商品ID, 数量) → 成功
// 支付服务:Try阶段(准备支付,本地事务)
支付服务.准备支付(事务ID, 用户ID, 商品ID, 金额) → 成功
// 协调者检查所有参与者成功,提交事务
提交事务(事务ID) // 结果:订单、库存、支付均成功
}
// 任一参与者失败(以库存扣减失败为例)
秒杀请求失败(用户ID, 商品ID, 数量) {
开始全局事务(事务ID)
订单服务.创建订单(事务ID, 用户ID, 商品ID, 数量) → 成功
库存服务.扣减库存(事务ID, 商品ID, 数量) → 失败
// 协调者发起Rollback阶段
订单服务.回滚订单(事务ID) → 成功
库存服务.回滚库存(事务ID) → 失败(补偿失败,需人工干预)
回滚事务(事务ID) // 结果:订单回滚,库存未恢复
// 补偿逻辑(超时重试,5秒内重试3次)
库存服务.补偿库存(事务ID, 商品ID, 数量) {
重试次数 = 0
while (重试次数 < 3 && 重试次数 < 5秒内重试次数) {
重试次数++
try {
// 幂等性检查:检查库存是否已恢复
if (库存服务.检查库存状态(事务ID, 商品ID) == "已恢复") {
return
}
库存服务.加库存(事务ID, 商品ID, 数量) → 成功
break
} catch (异常) {
if (重试次数 == 3) {
// 超时重试失败,人工介入
运维介入(事务ID, "库存补偿失败")
}
}
}
}
}
5) 【面试口播版答案】(约90秒)
“面试官您好,秒杀场景的分布式事务设计,核心是保证订单、库存、支付的一致性,通常采用补偿事务模式(如Seata的AT模式或TCC模式)。具体来说,当用户发起秒杀请求,协调者(如Seata的TC)创建全局事务,依次调用订单、库存、支付服务执行本地操作。比如订单服务先创建订单,库存服务扣减库存,支付服务准备支付。每个参与者返回成功或失败,协调者根据结果决定提交或回滚。以Seata AT模式为例,预提交阶段(Try)执行本地事务,若所有参与者成功,则提交;若失败,则回滚。优点是对业务无侵入,补偿由框架自动处理;缺点是预提交可能阻塞,在高并发下需考虑超时回滚。TCC模式通过Try(预检查)、Confirm(执行)、Cancel(补偿)三个阶段,无阻塞,性能高,但补偿逻辑复杂。秒杀场景中,由于并发极高,推荐使用Seata AT模式,因为它能保证业务正确性,同时兼顾性能。补偿事务需设计超时重试(如5秒内重试3次)和幂等性检查(如库存补偿前检查是否已恢复),避免重复操作。总结来说,分布式事务设计需平衡一致性、性能和容错,秒杀场景下,通过协调者管理参与者状态,确保要么全成功,要么全回滚,最终保证业务一致性。”
6) 【追问清单】
7) 【常见坑/雷区】