毒蛇大怒:你缠它身子,你下贱!
蟒蛇:你不也亲了它吗?
前情回顾看着文章的标题,不知道大家能否想到具体是什么问题,如果你有点懵,那就对了! (你不懵的话我这篇文章就没存在的意义了,嘿嘿)
在给大家指出具体是什么问题时,我们先来回顾一些内容
Spring 事务原理相信大家对这个都能说上来一些,Spring 事务是 Spring AOP 的一种具体应用,底层依赖的是动态代理
大致流程类似如下
通过代理对象来调用目标对象,而在代理对象中有事务相关的增强处理
具体细节可参考以下文章
Spring 事务源码解析
结合 ThreadLocal 来看 Spring 事务源码,感受下清泉般的洗涤!
记一次线上问题 → 事务去哪了
Spring 动态数据源原理原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么中已经详细介绍过了,流程大体如下
Spring AOP → 将我们指定的 lookupKey 放入 ThreadLocal
ThreadLocal → 线程内共享 lookupKey
DynamicDataSource → 对多数据源进行封装,根据 ThreadLocal 中的 lookupKey 动态选择具体的数据源
有什么问题既然事务和动态数据源都是 Spring AOP 的具体应用,那么代理就存在先后顺序了
要么是
要么是
我们来看看这两者有什么区别
事务在前,动态数据源在后此时,事务的前置增强处理会先生效,那么此时开始事务获取的 Connection 从哪来 ? 肯定是从 DynamicDataSource 来,因为我们给事务管理器配置的就是它
@Bean public PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) { // 配置事务管理, 使用事务时在方法头部添加@Transactional注解即可 return new DataSourceTransactionManager(dynamicDataSource); }