自适应网站一般做多大尺寸,兰州网络seo公司,腾讯企业邮箱怎么注册,wordpress後台小程序概述
在多数据源的配置下#xff0c;业务中经常遇到在一个被本地事务包裹的save/edi方法中需要查询另一个数据源的数据#xff1b; 直接查询会提示table不存在#xff0c;这是因为一个事务和一个mysql连接是绑定的#xff0c;mysql的连接背后包含了数据库信息#xff0c;…概述
在多数据源的配置下业务中经常遇到在一个被本地事务包裹的save/edi方法中需要查询另一个数据源的数据 直接查询会提示table不存在这是因为一个事务和一个mysql连接是绑定的mysql的连接背后包含了数据库信息直接调用还是在当前连接上调用的
这里可以利用事务的单一connection连接这个特性曲线解决这个问题
环境 mysql8 springboot2.7.4
方法
方法很简单就是在查询另一个数据源时开启一个新事务就行了 public class LogicDeleteTest {Transactionalpublic void asLinkDiscountServiceLogicDelete(){//获取aop代理类((LogicDeleteTest)AopContext.currentProxy()).findDataFromOtherDataSource();}Transactional(propagation Propagation.REQUIRES_NEW)public Object findDataFromOtherDataSource(){return null;}}源码分析
spring的事务整体流程大致如下; 可以实际debug一波看下多数据源下使用上述2个事务后spring对事务的执行流程;
获取事务的属性Transactional注解中的配置加载配置中的TransactionManager.获取收集事务信息TransactionInfo执行目标方法出现异常尝试处理。清理事务相关信息提交事务
简单起见可以从这个源码class方法中入手 org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction
最后在这个方法中开启了新事务并获取了一个新连接 org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin
再往下就是根据注解上的数据源name获取对应的数据源获取到对应数据源后之后的流程就和普通查询流程一样了 com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder#peek com.baomidou.dynamic.datasource.DynamicRoutingDataSource#getDataSource