Spring 下,关于动态数据源的事务问题的探讨

  毒蛇大怒:你缠它身子,你下贱!

  蟒蛇:你不也亲了它吗?

Spring 下,关于动态数据源的事务问题的探讨

前情回顾

看着文章的标题,不知道大家能否想到具体是什么问题,如果你有点懵,那就对了! (你不懵的话我这篇文章就没存在的意义了,嘿嘿)

在给大家指出具体是什么问题时,我们先来回顾一些内容

  Spring 事务原理

  相信大家对这个都能说上来一些,Spring 事务是 Spring AOP 的一种具体应用,底层依赖的是动态代理

  大致流程类似如下

    

Spring 下,关于动态数据源的事务问题的探讨

  通过代理对象来调用目标对象,而在代理对象中有事务相关的增强处理

  具体细节可参考以下文章      

    Spring 事务源码解析

    结合 ThreadLocal 来看 Spring 事务源码,感受下清泉般的洗涤!

    记一次线上问题 → 事务去哪了

  Spring 动态数据源原理

  原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么中已经详细介绍过了,流程大体如下

    

Spring 下,关于动态数据源的事务问题的探讨

  Spring AOP → 将我们指定的 lookupKey 放入 ThreadLocal

  ThreadLocal → 线程内共享 lookupKey

  DynamicDataSource → 对多数据源进行封装,根据 ThreadLocal 中的 lookupKey 动态选择具体的数据源

有什么问题

既然事务和动态数据源都是 Spring AOP 的具体应用,那么代理就存在先后顺序了

要么是

Spring 下,关于动态数据源的事务问题的探讨

要么是

Spring 下,关于动态数据源的事务问题的探讨

我们来看看这两者有什么区别

  事务在前,动态数据源在后

  此时,事务的前置增强处理会先生效,那么此时开始事务获取的 Connection 从哪来 ? 肯定是从 DynamicDataSource 来,因为我们给事务管理器配置的就是它

@Bean public PlatformTransactionManager transactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) { // 配置事务管理, 使用事务时在方法头部添加@Transactional注解即可 return new DataSourceTransactionManager(dynamicDataSource); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszsx.html