这篇文章主要介绍了javaSpringBoot分布式事务怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javaSpringBoot分布式事务怎么解决文章都会有所收获,下面我们一起来看看吧。首先,到底啥是分布式事务呢,比如我们在执行一个业务逻辑的时候有两步分别操作A数据源和B数据源,当我们在A数据源执行数据更改后,在B数据源执行时出现运行时异常,那么我们必须要让B数据源的操作回滚,并回滚对A数据源的操作;这种情况在支付业务时常常出现;比如买票业务在最后支付失败,那之前的操作必须全部回滚,如果之前的操作分布在多个数据源中,那么这就是典型的分布式事务回滚;了解了什么是分布式事务,那分布式事务在java的解决方案就是JTA(即Java Transaction API);springboot官方提供了 Atomikos or Bitronix的解决思路;其实,大多数情况下很多公司是使用消息队列的方式实现分布式事务。本篇文章重点讲解springboot环境下,整合 Atomikos +mysql+mybatis+tomcat/jetty;pom.xml中添加atomikos的springboot相关依赖:点进去会发现里面整合好了:transactions-jms
、transactions-jta
、transactions-jdbc
、javax.transaction-api
把数据源的相关配置项单独提炼到一个application.yml中:注意:这回我们的spring.datasource.type
是com.alibaba.druid.pool.xa.DruidXADataSource;
spring.jta.transaction-manager-id
的值在你的电脑中是唯一的,这个详细请阅读官方文档;完整的yml文件如下:在DruidConfig.java中实现多个数据源的注册;分布式事务管理器的注册;druid的注册分别配置每个数据源对应的sqlSessionFactory,以及MapperScan扫描的包MybatisDatasourceConfig.javaMybatisDatasource2Config.java由于我们本例中只使用一个事务管理器:xatx,故就不在使用TxAdviceInterceptor.java
和TxAdvice2Interceptor.java
中配置的事务管理器了;有需求的童鞋可以自己配置其他的事务管理器;(见DruidConfig.java中查看)新建分布式业务测试接口JtaTestService.java和实现类JtaTestServiceImpl.java其实就是一个很简单的test免费云主机域名01()方法,在该方法中我们分别先后调用classService.saveOrUpdateTClass(tClass);
和teacherService.saveOrUpdateTeacher(teacher);
实现先后操作两个数据源:然后我们可以自己debug跟踪事务的提交时机,此外,也可以在在两个方法全执行结束之后,手动制造一个运行时异常,来检查分布式事务是否全部回滚;注意:在实现类的方法中我使用的是:建立JtaTestContoller.java,接受一个来自前端的http请求,触发JtaTestService 的test01方法点击这个按钮,跳转到controller:当正常执行了sql语句之后,我们可以发现数据库并没有变化,因为整个方法的事务还没有走完,当我们走到1/0这步时:抛出运行时异常,并被spring事务拦截器拦截,并捕获异常:在this.completeTransactionAfterThrowing(txInfo, var16);
方法中会将事务全部回滚:22:09:04.243 logback [http-nio-8080-exec-5] INFO c.a.i.imp.CompositeTransactionImp – rollback() done of transaction 192.168.1.103.tm0000400006此时,当我们再次打开数据库验证,依旧没有变化,证明分布式事务配置成功。关于“javaSpringBoot分布式事务怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“javaSpringBoot分布式事务怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。
本文小编为大家详细介绍“react路由权限动态菜单如何配置”,内容详细,步骤免费云主机域名清晰,细节处理妥当,希望这篇“react路由权限动态菜单如何配置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。这里我使用 swr 来模拟获取当…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。