← 返回首页

Seata分布式事务框架

📂 java ⏱ 2 min 273 words

Seata分布式事务框架

Seata是阿里巴巴开源的分布式事务解决方案,提供AT、TCC、Saga和XA四种模式,其中AT模式零侵入、易集成,是微服务架构中最常用的分布式事务框架。

核心架构

Seata的AT模式基于二阶段提交协议,通过代理数据源实现无侵入事务:

// TC:事务协调器(独立部署)
// TM:事务管理器(发起全局事务)
// RM:资源管理器(管理本地事务)

@Configuration
public class SeataConfig {
    @Bean
    public DataSourceProxy dataSourceProxy(DataSource dataSource) {
        return new DataSourceProxy(dataSource);
    }
}

AT模式实战

配置文件

spring:
  application:
    name: order-service
  cloud:
    alibaba:
      seata:
        tx-service-group: my_tx_group

seata:
  service:
    vgroup-mapping:
      my_tx_group: default
    grouplist:
      default: localhost:8091
  registry:
    type: file

启用全局事务

@Service
@RequiredArgsConstructor
public class OrderService {
    private final InventoryClient inventoryClient;
    private final AccountClient accountClient;

    @GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
    public void createOrder(OrderDTO dto) {
        // 1. 创建订单
        orderMapper.insert(buildOrder(dto));

        // 2. 扣减库存(远程调用,自动参与全局事务)
        inventoryClient.deduct(dto.getSkuId(), dto.getQuantity());

        // 3. 扣减余额
        accountClient.deduct(dto.getUserId(), dto.getAmount());

        // 4. 模拟异常,自动回滚
        if (dto.getAmount() > 10000) {
            throw new BusinessException("订单金额超限");
        }
    }
}

Feign客户端

@FeignClient(value = "inventory-service", fallbackFactory = InventoryFallback.class)
public interface InventoryClient {
    @PostMapping("/inventory/deduct")
    Result<Void> deduct(@RequestParam String skuId, @RequestParam int quantity);
}

@Component
public class InventoryFallback implements FallbackFactory<InventoryClient> {
    @Override
    public InventoryClient create(Throwable cause) {
        return (skuId, quantity) -> {
            log.error("库存服务调用失败", cause);
            return Result.fail("库存服务不可用");
        };
    }
}

TCC模式

适用于需要自定义业务逻辑的场景:

public interface OrderTccService {
    @TwoPhaseBusinessAction(name = "createOrder",
        commitMethod = "confirm", rollbackMethod = "cancel")
    boolean tryCreate(@BusinessActionContext ParameterObject param);

    boolean confirm(BusinessActionContext context);
    boolean cancel(BusinessActionContext context);
}

@Service
public class OrderTccServiceImpl implements OrderTccService {
    @Override
    @Transactional
    public boolean tryCreate(ParameterObject param) {
        Order order = buildOrder(param);
        order.setStatus(OrderStatus.TRYING);
        orderMapper.insert(order);
        return true;
    }

    @Override
    public boolean confirm(BusinessActionContext context) {
        String orderId = context.getActionContext("orderId").toString();
        orderMapper.updateStatus(orderId, OrderStatus.CONFIRMED);
        return true;
    }

    @Override
    public boolean cancel(BusinessActionContext context) {
        String orderId = context.getActionContext("orderId").toString();
        orderMapper.updateStatus(orderId, OrderStatus.CANCELLED);
        return true;
    }
}

全局锁防脏写

// Seata AT模式自动获取行级锁,防止分布式脏写
// 可通过UNDO_LOG表查看回滚日志
CREATE TABLE undo_log (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    branch_id BIGINT NOT NULL,
    xid VARCHAR(100) NOT NULL,
    rollback_info LONGBLOB NOT NULL,
    log_status INT NOT NULL,
    log_created DATETIME NOT NULL,
    INDEX idx_xid (xid)
);

小结

Seata的AT模式以零侵入方式解决了微服务分布式事务问题,是Spring Cloud Alibaba生态的重要组件。