记一次springcloud+seata事务不进行回滚

不想看分析的。直接翻到最低。看解决方案

springcloud增加seata maven依赖



    com.alibaba.cloud
    spring-cloud-alibaba-seata
    2.1.0.RELEASE
    
        
            seata-all
            io.seata
        
    




    io.seata
    seata-all
    0.9.0

 

在application.yml中增加seata实例名以及增加file.conf和registry.conf。这两个文件可以直接从seata服务中拷贝

记一次springcloud+seata事务不进行回滚_第1张图片

然后我准备了三个服务和一个注册中心eureka.

记一次springcloud+seata事务不进行回滚_第2张图片

 

orders-service中调用user-service ,user-service 中调用product-service。启动注册中心和orders-service,user-service。product-service不启动。

记一次springcloud+seata事务不进行回滚_第3张图片

然后请求。异常有抛出。就一直未回滚事务。数据还入了库。最后通过源码分析。我断定应该undo_log数据未进行插入。打个断点果然undo_log这个表。一直就没有数据。undo_log这个表的意义就在。暂存上一个节点提交的事务。如果有异常。就会把这个数据回滚掉。也就是说下图这段代码肯定是没走

记一次springcloud+seata事务不进行回滚_第4张图片

最后翻翻源码发现。这个代理连接的类。是被DataSourceProxy调用的

记一次springcloud+seata事务不进行回滚_第5张图片 哦哦。那问题大致就出来了。也就是数据源。我要把这个DataSourceProxy进行配置下咯

记一次springcloud+seata事务不进行回滚_第6张图片

 

重新启动。然后就这样解决了。

解决方案:加入以下配置(注意:DataSourceProxy是seata包下的

@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(){
   SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSourceProx());
   return sqlSessionFactoryBean;
}
@Bean
@ConditionalOnBean(DataSource.class)
public DataSourceProxy dataSourceProx() {
    return new DataSourceProxy(dataSource);
}

项目我已放到gitee上https://gitee.com/eduction/springcloudSeata 。需要的自取参考

你可能感兴趣的:(springcloud,seata,seata,分布式事务,springcloud)