第三章 事务处理
一、本地事务(3.1)
核心概念
本地事务指在单一数据库或资源管理器内完成的事务操作,依赖数据库的ACID特性保证数据一致性。
1. 原子性与持久性实现
- Undo Log(回滚日志)
- 记录事务修改前的数据快照,用于事务失败时的回滚操作。
- 通过日志的逆向操作恢复数据到事务前状态。
- Redo Log(重做日志)
- 记录事务修改后的数据变更,确保事务提交后数据持久化。
- 数据库崩溃恢复时,通过重做日志重新执行已提交的事务。
2. 隔离性实现
- 锁机制
- 悲观锁:通过行锁、表锁等阻塞并发访问。
- 乐观锁:基于版本号或时间戳检测冲突(如MVCC)。
- MVCC(多版本并发控制)
- 通过保存数据的历史版本,允许读操作不阻塞写操作。
- 解决脏读、不可重复读问题,但可能产生幻读。
难点
- 隔离级别(如READ COMMITTED、REPEATABLE READ)对并发性能的影响。
- 幻读问题需通过间隙锁(Gap Lock)或串行化隔离级别解决。
二、全局事务(3.2)
核心概念
跨多个资源管理器(如多个数据库)的事务,依赖分布式事务协议(如XA协议)协调。
1. 两阶段提交(2PC)
- 阶段一:准备(Prepare)
- 协调者询问所有参与者是否可提交,参与者锁定资源并返回准备就绪状态。
- 阶段二:提交/回滚(Commit/Rollback)
- 若所有参与者同意提交,协调者发送提交指令;否则发送回滚指令。
问题
- 同步阻塞:参与者锁定资源期间,其他事务需等待。
- 单点故障:协调者宕机可能导致事务悬挂。
- 数据不一致:网络分区时可能部分提交、部分回滚。
2. 三阶段提交(3PC)
- 在2PC基础上引入超时机制和预提交阶段,降低阻塞风险。
- 新增阶段:CanCommit(询问能否提交) → PreCommit(预提交) → DoCommit(最终提交)。
对比2PC
- 优点:减少单点故障影响,降低阻塞概率。
- 缺点:实现复杂度更高,仍无法彻底解决数据不一致问题。
三、共享事务(3.3)
核心概念
在共享资源(如共享数据库连接)场景下协调事务,常见于跨服务调用但共享同一数据库的情况。
实现方式
- 共享事务管理器
- 通过单一事务管理器(如JTA)协调多个本地事务。
- 跨数据库事务
- 使用分布式事务协议(如XA)实现跨数据库的原子性。
局限性
- 强依赖底层数据库的XA支持。
- 性能损耗大,扩展性差。
四、分布式事务(3.4)
核心挑战
在分布式系统中,CAP定理限制了同时满足一致性(C)、可用性(A)、分区容忍性(P)的可能。
1. CAP与ACID的关系
- ACID:强调事务的强一致性。
- CAP:分布式环境下需权衡一致性与可用性。
- BASE理论:通过最终一致性(Basically Available, Soft state, Eventually consistent)平衡CAP。
2. 可靠事件队列(3.4.2)
原理
- 通过消息队列保证事务操作的最终一致性。
- 生产者将操作记录为事件并持久化,消费者异步处理。
实现步骤
- 本地事务与事件写入(保证原子性)。
- 消息队列投递事件(可能重试)。
- 消费者处理事件并更新状态。
优缺点
- 优点:解耦服务,支持高可用。
- 缺点:需处理重复消息(幂等性),延迟较高。
3. TCC事务(3.4.3)
Try-Confirm-Cancel三阶段
- Try:预留资源(如冻结库存)。
- Confirm:提交确认(如扣减库存)。
- Cancel:补偿回滚(如解冻库存)。
适用场景
- 对一致性要求高且业务逻辑可拆分的场景(如电商支付)。
- 需业务代码显式实现Try/Confirm/Cancel接口。
缺点
- 代码侵入性强,实现复杂度高。
- 需处理悬挂问题(如Try超时后Cancel未执行)。
4. SAGA事务(3.4.4)
原理
- 长事务拆分为多个本地事务,每个事务提供补偿操作。
- 执行顺序:正向执行(如T1→T2→T3),失败时逆向补偿(如C3→C2→C1)。
两种模式
- 协同式(Choreography):无中心协调器,服务间通过事件触发。
- 编排式(Orchestration):由中心协调器(如状态机)控制流程。
优缺点
- 优点:适合长事务,避免资源长期锁定。
- 缺点:补偿逻辑复杂,可能产生"脏回滚"。
五、总结与对比
方案 | 一致性 | 性能 | 复杂度 | 适用场景 |
---|---|---|---|---|
2PC | 强一致 | 低 | 高 | 传统金融、数据库集群 |
可靠事件队列 | 最终一致 | 中 | 中 | 异步场景(如订单创建) |
TCC | 强一致 | 中 | 高 | 高并发支付、库存管理 |
SAGA | 最终一致 | 高 | 高 | 长流程业务(如旅行预订) |
关键结论
- 强一致性需求:优先考虑TCC或2PC,但需容忍性能损耗。
- 最终一致性场景:可靠事件队列或SAGA更合适。
- 无银弹:需根据业务特性(如延迟容忍度、回滚复杂度)选择方案。
多选题
题目1:关于本地事务的隔离性实现,哪些描述正确?
A. 读未提交(Read Uncommitted)通过共享锁实现
B. 可重复读(Repeatable Read)通过多版本并发控制(MVCC)实现
C. 序列化(Serializable)通过范围锁(Range Lock)避免幻读
D. 读已提交(Read Committed)通过写锁(Exclusive Lock)保证数据一致性
题目2:两阶段提交(2PC)的局限性包括哪些?
A. 协调者单点故障可能导致事务阻塞
B. 事务参与者无法独立回滚本地操作
C. 网络分区可能导致数据不一致
D. 无法保证ACID中的原子性和持久性
题目3:关于CAP定理,哪些说法正确?
A. 分布式系统必须同时满足一致性和可用性
B. 分区容忍性(P)是必须保障的
C. 在发生网络分区时,系统可以暂时牺牲一致性以保证可用性
D. ACID中的一致性(Consistency)与CAP中的C含义相同
题目4:可靠事件队列模式的特点包括哪些?
A. 依赖消息队列的持久化保证
B. 需要业务逻辑实现幂等性
C. 事务最终一致性通过异步重试实现
D. 适用于强一致性要求的金融交易
题目5:TCC事务的三个阶段中,必须满足哪些条件?
A. Try阶段需要预留资源并锁定状态
B. Confirm和Cancel操作必须保证幂等性
C. Try阶段失败后直接回滚本地事务
D. Cancel阶段需要补偿Try阶段的操作
题目6:SAGA事务的适用场景包括哪些?
A. 需要强一致性的订单支付流程
B. 长时间运行的跨服务业务流程
C. 每个子事务都有对应的补偿操作
D. 支持部分提交和异步补偿
题目7:关于分布式事务的补偿机制,哪些描述正确?
A. TCC的Cancel阶段是业务逻辑补偿
B. SAGA的补偿操作必须严格顺序执行
C. 可靠事件队列通过消息重试实现自动补偿
D. 所有补偿操作必须保证幂等性
题目8:以下哪些场景可能导致全局事务的"悬挂"问题?
A. 两阶段提交中协调者宕机后恢复
B. TCC事务的Confirm阶段超时后重试
C. 可靠事件队列的消息重复消费
D. SAGA事务的补偿操作未正确回滚
题目9:关于事务的隔离级别,哪些描述正确?
A. 读已提交(Read Committed)可能产生不可重复读
B. 可重复读(Repeatable Read)完全避免幻读
C. 序列化(Serializable)通过锁机制实现最高隔离性
D. 读未提交(Read Uncommitted)可能导致脏读
题目10:分布式事务中,哪些方法可以避免"脏写"?
A. 在TCC的Try阶段使用乐观锁
B. 可靠事件队列中采用唯一事务ID去重
C. SAGA事务通过补偿操作回滚已提交的子事务
D. 两阶段提交(2PC)的第二阶段提交所有资源
答案与解析
题目1答案:B、C
- 解析 :
- B. 可重复读通过MVCC维护数据快照,保证同一事务内多次读取结果一致。
- C. 序列化通过范围锁防止其他事务插入新数据(幻读)。
- A错误:读未提交无需锁,直接读取未提交数据。D错误:读已提交通过行级锁保证当前读,但写锁与隔离级别无直接关联。
题目2答案:A、C
- 解析 :
- A. 协调者故障可能导致参与者长期阻塞。
- C. 网络分区可能导致部分节点提交而其他节点未提交,数据不一致。
- B错误:参与者可本地回滚。D错误:2PC保证原子性和持久性。
题目3答案:B、C
- 解析 :
- B. 分区容忍性是分布式系统的基础。
- C. CAP中,在分区发生时需在C和A之间权衡。
- A错误:CAP三者只能满足其二。D错误:ACID的C指业务规则约束,CAP的C指数据一致性。
题目4答案:A、B、C
- 解析 :
- A. 消息队列需持久化防止消息丢失。
- B. 消息可能重复,业务需幂等。
- C. 异步重试确保最终一致性。
- D错误:可靠事件队列适用最终一致性场景。
题目5答案:B、D
- 解析 :
- B. Confirm/Cancel需幂等以防止重复执行。
- D. Cancel需回滚Try阶段的资源预留。
- A错误:Try阶段仅预留资源,不锁定。C错误:Try失败后需触发Cancel。
题目6答案:B、C、D
- 解析 :
- B. SAGA适合长时间跨服务流程。
- C/D. SAGA通过补偿操作实现最终一致性,允许部分提交。
- A错误:SAGA不保证强一致性。
题目7答案:A、C、D
- 解析 :
- A. TCC的Cancel是业务补偿逻辑。
- C. 可靠事件队列通过重试补偿失败操作。
- D. 所有补偿需幂等。
- B错误:SAGA补偿可并行执行。
题目8答案:B、D
- 解析 :
- B. Confirm超时重试可能导致事务状态不一致。
- D. 补偿未正确执行可能导致部分提交。
- A错误:协调者恢复后可继续流程。C错误:消息重复消费由幂等性解决。
题目9答案:A、C、D
- 解析 :
- A. 读已提交可能不可重复读。
- C. 序列化通过锁实现最高隔离。
- D. 读未提交可能读到未提交数据。
- B错误:可重复读可能仍有幻读(某些数据库例外,如MySQL InnoDB)。
题目10答案:A、B
- 解析 :
- A. 乐观锁防止并发写冲突。
- B. 唯一ID去重避免重复处理。
- C错误:SAGA无法回滚已提交的子事务。D错误:2PC第二阶段可能部分提交。