不想看分析的。直接翻到最低。看解决方案
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 。需要的自取参考