网站设计心得,学校网站开发建设合同,宁波响应式网站制作,抖音账号权重查询入口遇到的问题
在微服务项目中 有A、B、C三个服务 其中 A调用B服务 #xff0c;B调用C#xff0c; 这些就是跨服务调用了#xff0c;在A服务中 还调用了一个当前模块执行插入数据的方法(在这里我就叫它为AA 也就是mybatis/spring管理的本地事务)
A服务开启全局事务注解 Globa…遇到的问题
在微服务项目中 有A、B、C三个服务 其中 A调用B服务 B调用C 这些就是跨服务调用了在A服务中 还调用了一个当前模块执行插入数据的方法(在这里我就叫它为AA 也就是mybatis/spring管理的本地事务)
A服务开启全局事务注解 GlobalTransactional B服务注解 Transactional(propagation Propagation.REQUIRES_NEW) C服务注解 Transactional(propagation Propagation.REQUIRES_NEW) AA是所属A模块中的Service的一个方法 也叫本地服务
遇到的问题1 A调用B失败后 A提交了没有回滚
原因 A调用B失败后 B抛出的异常被 微服务全局捕异常给处理了 并没有抛出异常(再抛还是会被全局捕异常处理的) TM不知道B失败了
这里可以在全局捕异常中将 分布式事务关闭 /*** 如果开启分布式事务就设置response.status 500seata的tm事务管理器* 并主动回滚**/private static void setRespErrStatus(HttpServletResponse response) {//如果开启分布式事务,设置错误状态码,让事务回滚if (StringUtils.isNotBlank(RootContext.getXID())) {log.error(全局捕异常 捕获到Seata 事务id-------------API--------- RootContext.getXID());log.error(全局捕异常 捕捉到Seata 事务 RootContext.getXID() 抛出异常 设置response 状态码为 500 );log.error(全局捕获到 Seata异常 全局回滚);try {response.setStatus(500);GlobalTransactionContext.reload(RootContext.getXID()).rollback();log.error( 数据提交失败);} catch (TransactionException e) {log.error( 捕获seata异常·不处理);}} else {response.setStatus(200);}}
遇到的问题2B调用C失败后 AB都提交了没有回滚
原因 : C服务虽然加了 Transactional(propagation Propagation.REQUIRES_NEW) 这个在TM没有注册进来(听说是Seata中的bug 博主没有去复现这个问题 这个需要我们调用 RootContext.bind(xid); 进行绑定 )
在Feign调用前 判断 xid是否为空 如果不为空则将 xid绑定 String xid RootContext.getXID() ; //获取 xid RootContext.bind(xid); //绑定 xid
遇到的问题3A调用AA失败后 ABC都提交了没有回滚
原因 : 这个是因为分布式事务调用是正常的只是本地事务失败了 所有分布式事务都提交了本地事务未提交 ()
遇到的问题4ABC服务都失败了ABC事务回滚了 AA提交了
原因 这个是因为分布式事务调用失败, AA本地事务没有加入到分布式事务中去导致的 String xid RootContext.getXID() ;xxService.insertScoresGoodInfos(sSysProjectMenu.getPath(),xid);Overridepublic int insertScoresGoodInfos(String sysType ,String xid) {RootContext.bind(xid); // 将本地事务加到分布式事务组中去return baseMapper.insertScoresGoodInfos(sysType, sysType UUID.randomUUID().toString());} maven
版本如下 seata 版本为1.6.1 (SpringCloud Alibaba里面自带的如果想用更高版本的可以 排查单独引入 不推荐这个比较坑)
spring-cloud.version2021.0.8/spring-cloud.versionspring-cloud-alibaba.version2021.0.5.0/spring-cloud-alibaba.versionspring-boot.version2.7.13/spring-boot.versiondruid.version1.2.18/druid.versiondynamic-ds.version3.5.2/dynamic-ds.versionmysql.version5.1.49/mysql.version!-- SpringCloud 微服务 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency!-- SpringCloud Alibaba 微服务 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency!-- SpringBoot 依赖配置 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependency!-- Druid --dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion${druid.version}/version/dependency!-- Dynamic DataSource --dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion${dynamic-ds.version}/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion${mysql.version}/version/dependency!-- Seata--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency