第二阶段如果全局事务需要回滚,那么 TC 会通知各分支事务参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的 undo_log 日志,通过回滚日志生成反向 SQL 并执行,完成事务提交之前的状态,如果回滚失败便会重试回滚操作!
本章分析Seata在TCC模式下,TM、RM、TC角色的原理。StorageTccAction是Dubbo客户端ReferenceBean,freeze方法被@TwoPhaseBusinessAction标注,会在发送RPC请求前注册分支事务。
例如一个下单业务中,假设由「扣减库存、新增订单」两个操作组成,在单库中通过MySQL提供的事务机制,能够确保该事务中任意操作执行出现问题时,另一个操作变更的数据可以回滚,从而确保整库数据的一致性,避免产生库存扣了,但订单却未增加的情况出现。
如上图所示,在单机服务中,三部分内容共用同一个数据库实例,所以我们只需要本地事务就可以解决数据的一致性,以Spring框架为例,我们只需要在方法上添加 @Transaction 注解就可以实现整个购买流程中数据的一致性:分布式事务场景。