Seata分布式事务框架
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生态的重要组件。