Java分布式事务管理框架之 Seata
什么是 Seata
Seata 是一款开源的分布式事务管理框架,由阿里开源团队于 2019 年推出,提供了针对面向微服务架构的分布式事务解决方案,支持本地事务和全局分布式事务,并且支持多种数据源和多语言、多开发框架。
Seata 支持的事务模式
Seata 支持 AT、TCC、SAGA、XA 四种事务模式,其中:
-
AT:即自动补偿型事务,应用程序在事务提交时,并不会直接提交到数据库,而是先执行业务相关的补偿操作,如果补偿成功则再真正提交。
-
TCC:即两阶段补偿型事务,通过预留资源和补偿操作实现分布式事务。在 TCC 模式下,事务是一组相关的本地事务,可能存在部分操作成功而部分操作失败的情况,需要在第二阶段执行补偿操作。
-
SAGA:可以理解为“业务状态机”模式,将业务拆分为多个阶段,每个阶段执行本地事务并记录状态,根据状态转移实现分布式事务。SAGA 模式适用于业务扩张性比较好,适应性强的场景。
-
XA:即分布式事务协议,它可以跨越不同的数据库和消息队列,保证多个参与者在同一个事务范围内共同协作,从而实现分布式事务。
在使用 Seata 时,可以根据不同的业务场景选择不同的事务模式。
Seata 的基本架构
Seata 的架构包括三个重要组件:
-
Transaction Coordinator(TC):也就是全局事务协调者,主要负责全局事务的协调,事务的注册、锁定、回滚和提交等工作。
-
Transaction Manager(TM):也就是分支事务管理器,负责分支事务的生命周期,包括本地事务的开始、提交、回滚等操作。
-
Resource Manager(RM):也就是分布式事务参与者,表示每个需要参与分布式事务的资源,负责与 TC、TM 通信,接受和执行相应的事务指令。
Seata 的应用程序主要分为两类:
-
Service:业务服务,或者数据存储服务,通过 Seata Client 向 Seata 客户端组件注册成为 Seata 的分布式事务参与者。
-
Seata Client:代理应用程序,主要包含两个组件,分别是 RM 和 TM,RM 负责维护与 TC 和 TM 的网络连接,接收和分发事务指令;TM 负责管理该应用程序的本地事务。
Seata 的应用场景
Seata 开发的初衷是为了解决分布式事务一致性问题,它适用于以下场景:
-
业务场景复杂,需要将单体架构拆分为微服务,但在尽可能多的保持单服务原子性的前提下,需要实现多个业务服务的协同。
-
数据源分析和调整本身能力不足,数据存储的分布式框架复杂,各种数据存储之间的差异比较大,这些都使得解决分布式事务问题成为必要的任务。
-
业务系统对可扩展性有较高要求,如果采用单体架构来实现业务拆分,则后续的协同和维护成本都较高。
Seata 的使用流程
Seata 的使用流程非常简单,主要分为以下三个步骤:
-
Server 端配置:下载 Seata Server 的压缩包,解压后,修改配置文件,包括注册中心地址、数据库类型、数据库地址、用户名、密码和 Server 端口等信息。
-
Client 端配置:在业务应用程序中添加 Seata Client 依赖,通过修改配置文件或 Spring 配置文件声明本地事务管理器和全局事务管理器的地址。
-
编写分布式事务代码:修改应用程序的业务代码,通过 Seata Client API 调用实现分布式事务,根据需要选择相应的分布式事务模式、配置事务属性、管理分支事务及异常处理等。
以下为两个简单的 Seata 示例:
示例 1:AT 模式
@Autowired
private AccountMapper accountMapper;
@Override
@Transactional
public void updateAccountBalance(Integer accountId, BigDecimal amount) {
// 先扣减账户金额
Account account = accountMapper.selectById(accountId);
account.setAmount(account.getAmount().subtract(amount));
accountMapper.updateById(account);
// 模拟异常,测试 Seata 回滚机制
int i = 1 / 0;
// 再增加账户金额
account = accountMapper.selectById(accountId);
account.setAmount(account.getAmount().add(amount));
accountMapper.updateById(account);
}
示例 2:TCC 模式
@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
public void createOrder(Order order) {
// 扣减商品库存
inventoryService.tryDecreaseStock(order.getProductId(), order.getCount());
// 创建订单
orderMapper.insert(order);
}
总结
Seata 是一款对于分布式事务问题很好的解决方案,可以支持不同的事务模式,并且可以跨越多种数据源。在实际业务场景中,使用 Seata 可以有效地保障分布式事务的一致性,也可以提高业务系统的可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java分布式事务管理框架之Seata - Python技术站