跳转至

第六章:XA 模式

XA 模式原理

工作流程

XA 模式工作流程:

一阶段:
1. TM 开启全局事务
2. RM 注册分支事务
3. RM 执行 SQL(不提交)
4. RM 返回执行结果

二阶段(提交):
1. TC 通知 RM 提交
2. RM 提交本地事务

二阶段(回滚):
1. TC 通知 RM 回滚
2. RM 回滚本地事务

XA 协议

XA 协议:
- XA START:开启 XA 事务
- XA END:结束 XA 事务
- XA PREPARE:准备提交
- XA COMMIT:提交事务
- XA ROLLBACK:回滚事务

使用 XA 模式

配置

seata:
  data-source-proxy-mode: XA

数据源配置

import io.seata.rm.datasource.xa.DataSourceProxyXA;

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean
    public DataSourceProxyXA dataSourceProxyXA(DataSource dataSource) {
        return new DataSourceProxyXA(dataSource);
    }
}

使用示例

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private AccountService accountService;

    @GlobalTransactional(name = "create-order")
    public void createOrder(Order order) {
        // 创建订单
        orderMapper.insert(order);

        // 扣减余额
        accountService.decreaseBalance(order.getUserId(), order.getAmount());
    }
}

XA vs AT

特性 XA 模式 AT 模式
一致性 强一致 最终一致
性能 较低 较高
侵入性
数据库支持 需要 XA 支持 任意数据库
全局锁 不需要 需要

适用场景

XA 模式适用场景:
- 传统数据库应用
- 需要强一致性
- 数据库支持 XA 协议
- 对性能要求不高

AT 模式适用场景:
- 互联网应用
- 对性能要求高
- 可接受最终一致
- 任意数据库

注意事项

1. 数据库支持

支持 XA 的数据库:
- MySQL
- PostgreSQL
- Oracle
- SQL Server

不支持 XA 的数据库:
- SQLite
- 部分 NoSQL

2. 性能影响

XA 模式性能影响:
- 数据库连接占用时间长
- 锁持有时间长
- 并发性能较低

3. 超时设置

seata:
  xa:
    connection-two-phase-hold-timeout: 10000  # 两阶段持有超时

小结

XA 模式要点:

  • 原理:XA 协议、两阶段提交
  • 使用:配置、数据源配置、使用示例
  • 对比:XA vs AT
  • 适用场景:传统数据库、强一致性
  • 注意事项:数据库支持、性能影响、超时设置

下一章我们将学习集群部署。