Seata分布式事务框架关于Annotation的SAGA模式分析

Seata分布式事务框架关于Annotation的SAGA模式分析

精选文章moguli202025-05-12 14:01:194A+A-

SAGA Annotation是 Apache Seata 版本 2.3.0 中引入的功能,它提供了一种使用 Java 注解而不是传统的 JSON 配置或编程 API 来实现 SAGA 事务模式的声明式方法。

Annotation说明

该特性的核心注解是@
CompensationBusinessAction,其定义如下:

@Retention(RetentionPolicy.RUNTIME)  
@Target({ElementType.METHOD})  
@Inherited  
public @interface CompensationBusinessAction {  
    String name();  
    String compensationMethod() default "compensation";  
    boolean isDelayReport() default false;  
    boolean useFence() default false;  
    Class<?>[] compensationArgsClasses() default {BusinessActionContext.class};  
}

此注解适用于参与 SAGA 事务的业务方法,关键属性如下:

name:saga 操作的唯一标识符

compensationMethod:需要回滚时调用补偿的方法名称

compensationArgsClasses:补偿方法所需的参数类别

isDelayReport:控制是否延迟分支报告

useFence:控制是否使用隔离机制(用于幂等性、非回滚或暂停)

Branch Type

Seata 在 BranchType 枚举中为 SAGA 注释添加了专用的分支类型:

public enum BranchType {  
    // AT Branch  
    AT,  
      
    TCC,  
      
    SAGA,  
      
    XA,  
      
    SAGA_ANNOTATION;   
}

使用示例

下面是一个基于测试类如何使用 SAGA 注释的简化示例:

public class NormalSagaAnnotationActionImpl implements NormalSagaAnnotationAction {  
  
    @Override  
    @CompensationBusinessAction(  
        name = "sagaActionForTest",   
        compensationMethod = "compensation",   
        compensationArgsClasses = {BusinessActionContext.class, SagaParam.class}  
    )  
    public boolean commit(  
        BusinessActionContext actionContext,   
        @BusinessActionContextParameter("a") int a,   
        @BusinessActionContextParameter(paramName = "b", index = 0) List b,   
        @BusinessActionContextParameter(isParamInProperty = true) SagaParam sagaParam) {  
        // 业务逻辑
        return a > 1;  
    }  
  
    @Override  
    public boolean compensation(BusinessActionContext actionContext, SagaParam param) {  
        // 补偿逻辑 
        return true;  
    }  
}
  • 业务方法提交使用 @CompensationBusinessAction 注解
  • 它指定了补偿方法为compensation
  • 参数使用 @BusinessActionContextParameter 注解标记,以指示哪些参数应被持久化并传递给compensation
  • 如果触发回滚,补偿方法将自动调用

交易执行

要执行注释模式的SAGA 事务,可以使用标准 Seata 全局事务 API:

GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();  
try {  
    tx.begin(60000, "testBiz");  
      
    // 执行业务逻辑 
    sagaAction.commit(null, 2, listB, sagaParam);  
      
    tx.commit();  
} catch (Exception ex) {  
    tx.rollback();  
    throw ex;  
}

汇总

  • SAGA 注解是传统 SAGA 模式的替代方案,传统 SAGA 模式之前需要 JSON 配置。
  • 该实现使用基于代理的拦截来处理事务生命周期。
  • 当需要事务回滚时,会自动调用补偿方法。
  • 与原始 SAGA 模式中基于 JSON 的状态机定义相比,该功能使开发更加以 Java 为中心。
  • 需要在依赖项中包含 seata-saga-annotation 模块才能使用此功能。
点击这里复制本文地址 以上内容由莫古技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

莫古技术网 © All Rights Reserved.  滇ICP备2024046894号-2