Seata分布式事务框架关于Annotation的SAGA模式分析
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 模块才能使用此功能。