一、背景
- 对于一个方法内,同时操作多个、或者多种类型的数据源时,比如一个MySQL、一个MongoDB,或者两个不同的MySQL,事务管理器只能唯一的场景
- 使用声明式的注解@Transactional 无法保证多个数据源回滚,只能保证单一数据源@Primary回滚,
- 使用编程式的方式去回滚事务,代码侵入太多,使用复杂度高。所以需要自定义注解,实现对多个数据源的管理
二、实现过程
1、自定义注解@MultiDataSourceTransactional
@Target({
ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MultiDataSourceTransactional {
@AliasFor("transactionManagers")
String[] values() default {
"transactionManager", "mongoTransactionManager"};
@AliasFor("values")
String[] transactionManagers() default {
"transactionManager", "mongoTransactionManager"};
}
2、定义切面
@Slf4j
@Aspect
@Configuration
public class MultiDataSourceTransactionalAspect {
private static final ThreadLocal<Stack<Pair<PlatformTransactionManager, TransactionStatus>>> THREAD_LOCAL = new ThreadLocal<>