代码地址
码云地址 | springboot根据租户id动态指定数据源: springboot根据租户id指定动态数据源,结合mybatis+mysql+多数源下的事务管理 |
创建3个数据库和对应的表
sql脚本在下图位置
代码的执行顺序
- 先设置主数据库的数据源
- 配置目标数据源和默认数据源
- 有了主库的数据源,才能读取主数据库配置的所有数据源,重新初始化数据源并放入ioc容器中
- 在访问service方法之前,先拦截到aop中,把请求头中的租户id,放入本地线程上下文中
- 在调用mapper接口的时候,跳转到自定义的数据源对应的determineCurrentLookupKey() 方法中,动态切换租户id下的数据源
- 拿到结果打印
aa方法,在header头中输入对应的租户id
可以看到对应的租户01对应的数据库下的表的数据 打印出来了
输入租户02,可以看到租户02对应数据库下的表的数据打印出来了
执行addBiao方法,输入对应的租户id
可以看到租户2的数据库中,王五并没有被插入,说明多数据源下的事务生效了,已经回滚数据了
注意
aop的执行顺序,一定要比事务管理器的顺序要优先,否则事务不会生效
如果不设置Order注解,那么事务就不会拿到,DataSourceContextHolder设置的上下文中的租户id
到了动态数据源的方法中,就会获取数据源为null,也就是lookupKey为null