spring seate实战2pc、3pc、tcc、saga(3)

本文介绍了Spring Seate如何实现TCC(Try-Confirm-Cancel)分布式事务模式,详细讲解了TCC的三个阶段以及在Seata中的应用示例,包括Try、Confirm和Cancel方法的实现,并探讨了TCC模式的优点和挑战。
摘要由CSDN通过智能技术生成

spring seate实战2pc、3pc、tcc、saga。

seate实战tcc

TCC(Try-Confirm-Cancel)是一种用于解决分布式事务问题的设计模式,它通过将一个复杂的分布式事务拆分成三个阶段来实现:

Try阶段:尝试执行所有操作,并将所有修改记录在本地事务日志中。
Confirm阶段:所有操作都已成功执行,向分布式协调器发送确认请求,并将本地事务日志标记为“已提交”。
Cancel阶段:有任何一个操作执行失败,向分布式协调器发送回滚请求,并将本地事务日志标记为“已回滚”。

以下是使用Seata实现TCC模式的示例代码:

首先需要在代码中引入Seata相关依赖,同2PC。
在启动类中配置Seata的相关参数,同2PC。

使用@TwoPhaseBusinessAction注解来标记每个TCC事务的每个阶段方法,并在第一个阶段的方法中调用TCC上下文来记录操作信息。同时,使用@GlobalTransactional注解来标记整个TCC事务的开始方法:

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private ProductServiceFeignClient productServiceFeignClient;

    @Autowired
    private AccountServiceFeignClient accountServiceFeignClient;

    @GlobalTransactional(timeoutMills = 300000, name = "order-service-tcc")
    @Override
    public String createOrder(OrderDTO orderDTO) {
        orderMapper.createOrder(orderDTO);

        try {
            productServiceFeignClient.tryReduceStock(orderDTO.getProductId(), orderDTO.getAmount());
            accountServiceFeignClient.tryReduceBalance(orderDTO.getUserId(), orderDTO.getTotalPrice());

            SeataTccContextUtils.getCurrentContext().set("status", "T");
        } catch (Exception e) {
            SeataTccContextUtils.getCurrentContext().set("status", "F");
            throw e;
        }

        return orderDTO.getId();
    }

    @TwoPhaseBusinessAction(name = "order-service-reduce-stock-tcc", commitMethod = "commitReduceStock", rollbackMethod = "rollbackReduceStock")
    @Override
    public boolean tryReduceStock(Long productId, Integer amount) {
        productServiceFeignClient.tryReduceStock(productId, amount);
        return true;
    }

    public boolean commitReduceStock(Long productId, Integer amount) {
        productServiceFeignClient.confirmReduceStock(productId, amount);
        return true;
    }

    public boolean rollbackReduceStock(Long productId, Integer amount) {
        productServiceFeignClient.cancelReduceStock(productId, amount);
        return true;
    }

    @TwoPhaseBusinessAction(name = "order-service-reduce-balance-tcc", commitMethod = "commitReduceBalance", rollbackMethod = "rollbackReduceBalance")
    @Override
    public boolean tryReduceBalance(Long userId, BigDecimal amount) {
        accountServiceFeignClient.tryReduceBalance(userId, amount);
        return true;
    }

    public boolean commitReduceBalance(Long userId, BigDecimal amount) {
        accountServiceFeignClient.confirmReduceBalance(userId, amount);
        return true;
    }

    public boolean rollbackReduceBalance(Long userId, BigDecimal amount) {
        accountServiceFeignClient.cancelReduceBalance(userId, amount);
        return true;
    }
}

在这个示例代码中,使用@GlobalTransactional注解来标记整个TCC事务的开始方法createOrder,并在try阶段的方法中记录操作状态,即如果所有操作都执行成功,则将状态设置为“T”,否则设置为“F”。在commit和rollback阶段的方法中,分别调用Feign客户端来发送确认和取消请求。

在Feign客户端中,也需要使用@TwoPhaseBusinessAction注解来标记TCC事务的每个阶段方法,并在try阶段的方法中将操作信息记录在TCC上下文中:

@FeignClient(name = "product-service")
public interface ProductServiceFeignClient {

    @TwoPhaseBusinessAction(name = "product-service-reduce-stock-tcc", commitMethod = "commitReduceStock", rollbackMethod = "rollbackReduceStock")
    @RequestMapping("/product/reduceStock")
    boolean tryReduceStock(@RequestParam("productId") Long productId, @RequestParam("amount") Integer amount);

    @RequestMapping("/product/confirmReduceStock")
    boolean commitReduceStock(@RequestParam("productId") Long productId, @RequestParam("amount") Integer amount);

    @RequestMapping("/product/cancelReduceStock")
    boolean rollbackReduceStock(@RequestParam("productId") Long productId, @RequestParam("amount") Integer amount);
}

在这个示例代码中,使用@TwoPhaseBusinessAction注解来标记TCC事务的每个阶段方法,并在try阶段的方法中将操作信息记录在TCC上下文中。

同样地,在AccountServiceFeignClient中也需要使用@TwoPhaseBusinessAction注解来标记TCC事务的每个阶段方法,并在try阶段的方法中将操作信息记录在TCC上下文中:

@FeignClient(name = "account-service")
public interface AccountServiceFeignClient {

    @TwoPhaseBusinessAction(name = "account-service-reduce-balance-tcc", commitMethod = "commitReduceBalance", rollbackMethod = "rollbackReduceBalance")
    @RequestMapping("/account/reduceBalance")
    boolean tryReduceBalance(@RequestParam("userId") Long userId, @RequestParam("amount") BigDecimal amount);

    @RequestMapping("/account/confirmReduceBalance")
    boolean commitReduceBalance(@RequestParam("userId") Long userId, @RequestParam("amount") BigDecimal amount);

    @RequestMapping("/account/cancelReduceBalance")
    boolean rollbackReduceBalance(@RequestParam("userId") Long userId, @RequestParam("amount") BigDecimal amount);
}

在这个示例代码中,也是使用@TwoPhaseBusinessAction注解来标记TCC事务的每个阶段方法,并在try阶段的方法中将操作信息记录在TCC上下文中。

TCC模式的优点在于,它将分布式事务拆分为三个阶段,可以更细粒度地控制事务的执行,避免锁定资源和长时间阻塞。但是,TCC模式的实现相对复杂,需要手动编写大量的代码来处理各种异常情况,同时需要在应用程序中保持状态一致性,因此需要更多的开发工作和测试工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2PC是指两阶段提交协议(Two-Phase Commit),它是一种用于分布式事务的协议。在2PC中,有一个协调者和多个参与者,协调者负责协调各参与者的操作。2PC协议包括准备阶段和提交阶段。在准备阶段,协调者向参与者发送准备请求,参与者执行操作并将执行结果通知协调者。在提交阶段,协调者向参与者发送提交请求,参与者根据事务结果进行提交或回滚操作。然而,2PC存在数据不一致的问题,即协调者在发生故障时可能无法通知参与者进行回滚,从而导致数据不一致的情况发生。 3PC是指三阶段提交协议(Three-Phase Commit),它是对2PC的改进。3PC在2PC的基础上引入了超时机制,将准备阶段再次分为两个阶段,即CanCommit和PreCommit阶段。在CanCommit阶段,协调者向参与者发送询问消息,参与者根据当前状态回复同意或中止。在PreCommit阶段,协调者向参与者发送预提交消息,参与者执行预提交操作并将执行结果通知协调者。最后,在提交阶段,协调者向参与者发送提交或中止请求。3PC相对于2PC能够缓解数据不一致的问题,但并不能完全解决。 TCC是指试验-确认-取消协议(Try-Confirm-Cancel),它是一种分布式事务处理模式。TCC模式将整个事务拆分为三个阶段:试验阶段、确认阶段和取消阶段。在试验阶段,业务逻辑进行预处理并进行一些检查,以确保事务可以成功执行。在确认阶段,事务的所有参与者进行确认操作,如果所有参与者都确认成功,则事务执行成功。在取消阶段,如果有任何一个参与者确认失败,则事务执行取消操作,回滚之前的操作。TCC模式相对于2PC和3PC更加灵活,并且可以通过实现自定义的接口来适应不同的业务场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【分布式】分布式事务基础概念(2PC,3PCTCC)](https://blog.csdn.net/bookssea/article/details/124359341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [理解2PC,3PCTCC](https://blog.csdn.net/h_big_tiger/article/details/100139899)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值