本文共 1252 字,大约阅读时间需要 4 分钟。
不想看分析的。直接翻到最低。看解决方案
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服务中拷贝
然后我准备了三个服务和一个注册中心eureka.
orders-service中调用user-service ,user-service 中调用product-service。启动注册中心和orders-service,user-service。product-service不启动。
然后请求。异常有抛出。就一直未回滚事务。数据还入了库。最后通过源码分析。我断定应该undo_log数据未进行插入。打个断点果然undo_log这个表。一直就没有数据。undo_log这个表的意义就在。暂存上一个节点提交的事务。如果有异常。就会把这个数据回滚掉。也就是说下图这段代码肯定是没走
最后翻翻源码发现。这个代理连接的类。是被DataSourceProxy调用的
哦哦。那问题大致就出来了。也就是数据源。我要把这个DataSourceProxy进行配置下咯
重新启动。然后就这样解决了。
解决方案:加入以下配置(注意:DataSourceProxy是seata包下的)
@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(){ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSourceProx()); return sqlSessionFactoryBean;}@Bean@ConditionalOnBean(DataSource.class)public DataSourceProxy dataSourceProx() { return new DataSourceProxy(dataSource);}
项目我已放到gitee上 。需要的自取参考
转载地址:http://umvbi.baihongyu.com/