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

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

springcloud增加seata maven依赖

<!--seata-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-seata</artifactId>
    <version>2.1.0.RELEASE</version>
    <exclusions>
        <exclusion>
            <artifactId>seata-all</artifactId>
            <groupId>io.seata</groupId>
        </exclusion>
    </exclusions>
</dependency>


<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-all</artifactId>
    <version>0.9.0</version>
</dependency>

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

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

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

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

扫描二维码关注公众号,回复: 12875317 查看本文章

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

 哦哦。那问题大致就出来了。也就是数据源。我要把这个DataSourceProxy进行配置下咯

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

解决方案:加入以下配置(注意: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 。需要的自取参考

猜你喜欢

转载自blog.csdn.net/saygood999/article/details/107981005