数据源动态切换、跨库事物失效问题解决方案
一、问题出现的场景
系统架构设计、每个企业一个企业库、通过数据源切在平台库、和企业库之间动态切换完成业务操作。
二、跨库事物失效的原因
1、Spring@Transactional不支持跨数据源事物,Spring 事物控制是基于数据库链接进行的,当数据源切换后,数据库链接切换,事物回滚只能回退,当前持有的链接。
2、Spring开启事物后,会将当前数据库及数据库链接资源进行线程绑定,导致数据源切换失效(数据源切换执行后,并未获取到新的数据库链接)。
三、解决方案
基于InheritableThreadLocal + aop 针对添加了跨库事务注解的方法进行拦截、线程标记、覆写mybatis自动提交,通过aop手动提交/回退,实现跨库事务。
1、自定义跨库事物注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited