seata分布式事务

分布式事务使用,组长有话说:

1、跨服务调用的 两边都有改数据或新增数据的 都要加上本地事物 并且 发起方要加上 分布式事物   千万别忘了啊

2、尤其是 调用mq的时候

3、 我把用到mq的地方都加了分布式注解,漏的你们看一下。

应用

portal的托运单,确认下单后,先同步到oms,再从oms同步到tms 。

 

1. 单据同步时,发送MQ。

MQ里面调用feign api。feign接口调用的service服务实现类都需要加事务控制。

调用方和被调用方都需要加事务注解。

@GlobalTransactional(rollbackFor = Exception.class)
@Transactional(rollbackFor = Exception.class)

2. 对单据进行修改操作时,首先要获取分布式锁。

成功取到锁,才能继续下面的业务操作,操作完后释放分布式锁。

 

Seata 官网地址: http://seata.io/zh-cn/

### Seata 分布式事务概述 Seata 是一款开源的分布式事务解决案,专为微服务架构设计,旨在提供高效、简单的分布式事务服务[^3]。该框架允许开发者通过适当配置和使用 `@GlobalTransactional` 注解,在分布式系统中实现事务的一致性,从而可以更专注于业务逻辑的开发而不必担心复杂的分布式事务处理[^1]。 ### Seata 的工作原理 Seata 实现了全局事务的概念,即在一个全局事务下协调多个本地事务分支来完成整个操作。具体来说: - **TM (Transaction Manager)** 负责维护全局事务的状态并驱动全局提交或回滚。 - **RM (Resource Manager)** 绑定到资源(通常是数据库连接),负责记录日志并向 TM 报告状态变化。 - **TC (Transaction Coordinator)** 作为独立的服务端组件,管理着所有的全局事务会话数据以及分支事务注册表。 当应用程序发起一个新的全局事务时,它会被分配唯一的 XID;之后所有参与此全局事务的操作都将携带相同的 XID 进行传播。最终由 TM 根据各 RM 上报的结果决定是提交还是回滚整个流程中的每一个局部更改。 ```java // 启动一个全局事务 @Transactional(rollbackFor = Exception.class) public void transferMoney(Account from, Account to, double amount) throws Throwable { try { // 执行转账逻辑... // 提交全局事务 } catch (Exception e) { // 处理异常情况,并触发全局回滚 throw new RuntimeException(e); } } ``` ### 使用指南与最佳实践 为了更好地利用 Seata 来管理和控制分布式环境下的事务行为,建议遵循以下几个面: #### 配置文件设置 确保正确设置了 seata-server 和各个客户端之间的通信参数,比如 registry.conf 中定义的服务发现机制和服务地址列表等信息。 #### 数据源代理 对于 Java 应用程序而言,通常需要采用 AT 模式的自动转换功能,这涉及到对 JDBC DataSource 对象进行包装以拦截 SQL 请求并自动生成必要的 undo_log 表结构用于补偿操作。 #### 错误重试策略 考虑到网络波动等因素可能导致部分请求失败的情况发生,合理设定超时时间和最大尝试次数可以帮助提高系统的稳定性和可靠性。 #### 日志级别调整 根据实际需求调节不同模块的日志输出等级,既有助于排查问题又不会因为过量的信息影响性能表现。 ### 解决案对比 相较于传统的 XA 协议,虽然两者都能达到 ACID 属性的要求,但是 Seata灵活且易于集成至现有的 Spring Cloud 或 Dubbo 生态体系当中去。此外,由于其采用了 TCC(Try Confirm Cancel) 及 Saga 等轻量化的设计思路,因此能够有效降低锁竞争带来的负面影响的同时还具备良好的扩展能力[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值