
1) 【一句话结论】:跨数据库分布式事务通过两阶段提交(2PC)或三阶段提交(3PC)实现,2PC保证强一致性但存在阻塞风险,3PC通过预提交阶段缓解阻塞,需结合补偿或最终一致性优化。
2) 【原理/概念讲解】:分布式事务的核心是全局事务管理器(协调者)和多个资源管理器(参与者,如数据库)。协调者负责发起事务、管理参与者状态,参与者负责执行本地事务并反馈状态。
Prepare请求,参与者检查本地事务并准备提交,返回CanCommit(可提交)或NotCommit(不可提交);Commit(提交)或Rollback(回滚)。Prepared请求,参与者检查并锁定资源(如数据库行级锁或分布式锁,如Redis/ZooKeeper),返回Prepared;Prepare请求,参与者确认锁定状态并返回CanCommit/NotCommit;Commit/Rollback。3) 【对比与适用场景】
| 特性 | 两阶段提交(2PC) | 三阶段提交(3PC) |
|---|---|---|
| 定义 | 两阶段提交协议,协调者主导 | 三阶段提交协议,增加预提交阶段 |
| 流程阶段 | 准备阶段 + 提交阶段 | 预提交阶段 + 准备阶段 + 提交阶段 |
| 优点 | 实现简单,保证强一致性 | 缓解阻塞风险,提高可用性 |
| 缺点 | 阻塞风险(参与者等待故障节点) | 实现复杂,需处理超时和重试 |
| 适用场景 | 参与者少、网络稳定、强一致性要求高 | 参与者多、网络不稳定、高可用要求高 |
| 注意点 | 需要协调者故障恢复机制 | 需要处理预提交阶段超时和参与者故障 |
4) 【示例】:假设有两个数据库A(存储用户余额)和B(存储订单信息),分布式事务操作是同时更新A的balance字段和B的order_status字段。协调者(事务管理器)发起全局事务,流程如下:
Prepare请求,A检查余额足够并返回CanCommit,B检查订单状态并返回CanCommit;Commit请求,A和B执行提交操作。Prepared请求,A和B锁定余额和订单状态(如A使用行级锁SELECT ... FOR UPDATE,B使用Redis分布式锁),返回Prepared;Prepare请求,A和B确认锁定状态并返回CanCommit;Commit请求,A和B执行提交操作。UPDATE balance SET ... WHERE id=...(退款),B执行UPDATE order_status SET ... WHERE id=...(取消订单))5) 【面试口播版答案】:面试官您好,关于跨数据库分布式事务,核心是通过两阶段提交(2PC)或三阶段提交(3PC)实现全局事务管理。首先,分布式事务由协调者(事务管理器)和多个参与者(资源管理器,如数据库)组成,协调者负责发起事务、管理参与者状态。2PC流程分为两阶段:准备阶段,协调者向所有参与者发送Prepare请求,参与者检查本地事务并准备提交,返回CanCommit或NotCommit;提交阶段,协调者根据响应,向所有参与者发送Commit或Rollback。3PC在此基础上增加预提交阶段:预提交阶段,协调者向参与者发送Prepared请求,参与者检查并锁定资源(如行级锁或分布式锁),返回Prepared;提交阶段,协调者发送Commit或Rollback。优缺点方面,2PC保证强一致性,但存在阻塞风险(如某个参与者故障导致其他参与者一直等待);3PC通过预提交阶段缓解阻塞,但实现更复杂,需处理超时和重试。解决活锁/死锁的方法:活锁是参与者因等待无法推进,死锁是参与者互相等待。解决措施包括:1. 超时重试,设置合理超时时间(如5秒),避免无限等待;2. 优先级策略,给关键事务(如支付)更高优先级,优先处理;3. 补偿事务,事务失败时执行相反操作(如订单支付失败后,取消订单并退款),通过补偿逻辑表存储失败事务,定期执行补偿任务;4. 最终一致性方案,允许短暂不一致,通过异步通知和重试机制最终达到一致。
6) 【追问清单】
7) 【常见坑/雷区】