Seata原理及简单使用

参考官网:https://seata.apache.org/zh-cn/docs/overview/what-is-seata/

介绍

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。

Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

事务模式

AT模式(默认模式)

概述

AT模式是一种补偿型事务模式,通过自动补偿机制实现数据回滚,无业务侵入。在AT模式下,Seata会为用户自动创建一张UNDO_LOG表,用于记录需要回滚的数据。当事务执行失败时,Seata会根据UNDO_LOG表中的记录自动进行反向SQL回滚,保证数据的一致性。

基本使用

@GlobalTransactional
public void purchase(String userId, String commodityCode, int count, int money) {
    jdbcTemplateA.update("update stock_tbl set count = count - ? where commodity_code = ?", new Object[] {count, commodityCode});
    jdbcTemplateB.update("update account_tbl set money = money - ? where user_id = ?", new Object[] {money, userId});
}

TCC模式

概述

TCC模式是一种补偿型三阶段事务模式,需要业务实现Try、Confirm和Cancel三个操作,有业务侵入,但灵活度高。在Try阶段,业务代码会尝试执行操作,并预留资源。在Confirm阶段,如果Try阶段执行成功,业务代码会确认操作并释放资源。在Cancel阶段,如果Try阶段执行失败,业务代码会取消操作并回滚资源。通过这种方式,TCC模式可以实现分布式事务的最终一致性。

基本使用

区别于在 AT 模式直接使用数据源代理来屏蔽分布式事务细节,业务方需要自行定义 TCC 资源的“准备”、“提交”和“回滚” 。比如在下方的例子中,

public interface TccActionOne {
    @TwoPhaseBusinessAction(name = "DubboTccActionOne", commitMethod = "commit", rollbackMethod = "rollback")
    public boolean prepare(BusinessActionContext actionContext, @BusinessActionContextParameter(paramName = "a") String a);
    public boolean commit(BusinessActionContext actionContext);
    public boolean rollback(BusinessActionContext actionContext);
}

Seata 会把一个 TCC 接口当成一个 Resource,也叫 TCC Resource。在业务接口中核心的注解是 @TwoPhaseBusinessAction,表示当前方法使用 TCC 模式管理事务提交,并标明了 Try,Confirm,Cancel 三个阶段。name属性,给当前事务注册了一个全局唯一的的 TCC bean name。同时 TCC 模式的三个执行阶段分别是:

  • Try 阶段,预定操作资源(Prepare) 这一阶段所以执行的方法便是被 @TwoPhaseBusinessAction 所修饰的方法。如示例代码中的 prepare 方法。

  • Confirm 阶段,执行主要业务逻辑(Commit) 这一阶段使用 commitMethod 属性所指向的方法,来执行Confirm 的工作。

  • Cancel 阶段,事务回滚(Rollback) 这一阶段使用 rollbackMethod 属性所指向的方法,来执行 Cancel 的工作。

其次,可以在 TCC 模式下使用 BusinessActionContext 在事务上下文中传递查询参数。如下属性:

  • xid 全局事务id

  • branchId 分支事务id

  • actionName 分支资源id,(resource id)

  • actionContext 业务传递的参数,可以通过 @BusinessActionContextParameter 来标注需要传递的参数。

在定义好 TCC 接口之后,我们可以像 AT 模式一样,通过 @GlobalTransactional 开启一个分布式事务。

@GlobalTransactional
public String doTransactionCommit(){
    tccActionOne.prepare(null,"one");
    tccActionTwo.prepare(null,"two");
}

注意,如果 TCC 参与者是本地 bean(非远程RPC服务),本地 TCC bean 还需要在接口定义中添加 @LocalTCC 注解,比如,

@LocalTCC
public interface TccActionTwo {
    @TwoPhaseBusinessAction(name = "TccActionTwo", commitMethod = "commit", rollbackMethod = "rollback")
    public boolean prepare(BusinessActionContext actionContext, @BusinessActionContextParameter(paramName = "a") String a);
    public boolean commit(BusinessActionContext actionContext);
    public boolean rollback(BusinessActionContext actionContext);
}

Saga模式

SAGA模式是一种补偿型长事务解决方案,通过状态机编排或者注解方式实现业务逻辑,需要业务实现正向和反向两个操作,有业务侵入。在SAGA模式下,业务代码会被拆分成一系列的小事务,每个小事务都有一个正向操作和一个反向操作。当事务执行失败时,Seata会依次调用每个小事务的反向操作,实现数据的回滚。

XA模式(2PC)

XA模式是一种强一致性的两阶段提交协议,需要数据库支持XA接口,牺牲了一定的可用性,无业务侵入。在XA模式下,事务被分为两个阶段:准备阶段和提交阶段。在准备阶段,参与事务的所有节点都会准备好执行事务操作,但并不真正执行。在提交阶段,如果所有节点都准备好执行事务操作,那么事务协调者会通知所有节点正式执行事务操作并提交;否则,事务协调者会通知所有节点回滚事务操作。

基本使用

posted @ 2025-10-24 17:19  18sui  阅读(8)  评论(0)    收藏  举报