开发者社区> 问答> 正文

请问一下阿里云使用at时commit里一直未空,是什么原因啊?

spring cloud alibaba 整合 sharding jdbc + mybatis plus + nacos + seata 1.5.2,在服务之间调用时, SeataATShardingTransactionManager 的 commit 里 seataTransactionHolder get 一直为空,在之前 begin 里 SeataTransactionHolder set是有值链接文字

展开
收起
游客lne2pqcof5w6c 2023-06-19 21:32:31 96 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    问题可能是由于 SeataATShardingTransactionManager 的上下文传递出现了问题导致的。在 SeataATShardingTransactionManager 的实现中,使用 ThreadLocal 来保存 Seata 事务上下文信息,以便在不同的线程之间传递。

    如果在 commit 方法中无法获取到 Seata 事务上下文信息,那么可能是因为在调用 commit 方法的线程中,Seata 事务上下文信息丢失或者没有被正确地传递。这种情况下,可以尝试以下几个方面进行排查:

    确认使用的版本是否正确。

    Seata AT 模式下,需要保证使用的 Seata 和 Spring Cloud Alibaba 的版本兼容。建议使用 Seata 1.4.2 和 Spring Cloud Alibaba 2.2.5.RELEASE 及以上版本,以确保兼容性。

    检查 Seata 事务上下文信息是否被正确地传递。

    在 Seata AT 模式下,需要使用 @GlobalTransactional 注解来开启分布式事务,并且确保在不同的服务之间调用时,Seata 事务上下文信息能够正确地传递。可以通过在 @GlobalTransactional 注解中指定传播特性来控制事务上下文的传递方式。

    例如,在被调用的服务中,可以使用 @GlobalTransactional 注解来开启分布式事务,并设置 propagation 为 Propagation.REQUIRES_NEW:

    java Copy @Service public class FooService {

    @Autowired
    private BarService barService;
    
    @GlobalTransactional(propagation = Propagation.REQUIRES_NEW)
    public void doSomething() {
        // ...
        barService.doSomethingElse();
        // ...
    }
    

    }

    
    这样,在调用 barService.doSomethingElse() 时,Seata 事务上下文信息将会被传递到 barService 中,以确保整个调用链的事务一致性。
    
    检查 Seata AT 配置是否正确。
    
    Seata AT 模式下,需要在每个参与分布式事务的服务中配置 Seata AT 相关的配置文件,以确保 Seata 能够正确地跟踪和管理事务。
    
    可以检查配置文件中的以下几个关键配置是否正确:
    
    seata.tx-service-group:Seata 事务组名称,需要保证所有服务都使用相同的名称。
    registry.type:注册中心类型,可以是 nacos、eureka 等。
    storage.type:事务日志存储类型,可以是 db、file 等。
    sharding.jdbc.config.shardingNode:Sharding JDBC 相关配置,需要保证和使用的 Sharding JDBC 版本兼容。
    如果配置文件中的配置不正确,Seata AT 事务的正常运行可能会受到影响。
    2023-06-20 08:11:19
    赞同 展开评论 打赏
  • 不断追求着最新的技术和趋势,在云技术的世界里,我不断寻找着新的机会和挑战,不断挑战自己的认知和能力。

    如果在使用阿里云Seata AT时,在服务之间调用时,SeataATShardingTransactionManager的commit方法中的seataTransactionHolder变量一直为空,可能是因为在跨多个服务的分布式事务中,事务管理器的配置存在一些问题。

    具体来说,有可能是某个参与事务的服务没有正确地向 Seata 注册自己的 TM(事务管理器)和 RM(资源管理器),导致最终在提交事务时无法获取到 SeataTransactionHolder 对象。因此,在 commit 方法中尝试获取 SeataTransactionHolder 时返回了 null 值。

    解决这个问题的方法是,需要确保每个参与事务的服务都正确地注册了自己的 TM 和 RM,并且在对应的事务注解(例如 @GlobalTransactional)中指定了正确的 TM。此外,还需要确保各个服务的版本兼容、配置正确,并且已经连接了 Seata Server。

    如果以上方法无效,可以进一步查看 Seata 客户端日志、各个服务的日志以及 Seata Server 的日志,以便查找问题的根源。另外建议你也可以通过 Seata 官方社区论坛寻求帮助和支持,以获得更加详细的技术指导。

    2023-06-19 23:34:49
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载