整合
springboot基于注解动态配置多数据源以及多数据源的事务统一 - 炫舞风中 - 博客园
Spring多数据源事务管理_bug猫的博客-CSDN博客_spring多数据源事务管理 两位博有中出现的不足,进行优化后得出新的总结,废话不多说 直接上代码, 本人亲测有效
1.application.xml 数据源配置
@Around(value = "pointcut()&&@annotation(annotation)")
public Object twiceAsOld(ProceedingJoinPoint point, TransactionalGroup annotation) throws Throwable {
Stack
Stack
try {
if (!openTransaction(dataSourceTransactionManagerStack, transactionStatuStack, annotation)) {
return null;
}
Object ret = point.proceed();
commit(dataSourceTransactionManagerStack, transactionStatuStack);
return ret;
} catch (Throwable e) {
rollback(dataSourceTransactionManagerStack, transactionStatuStack);
throw e;
}
}
private boolean openTransaction(Stack
Stack
String[] transactionMangerNames = multiTransactional.name();
if (ArrayUtils.isEmpty(multiTransactional.name())) {
return false;
}
for (String beanName : transactionMangerNames) {
//根据事务名称获取具体的事务
DataSourceTransactionManager dataSourceTransactionManager = (DataSourceTransactionManager) SpringContextUtil
.getBean(beanName);
TransactionStatus transactionStatus = dataSourceTransactionManager
.getTransaction(new DefaultTransactionDefinition());
transactionStatuStack.push(transactionStatus);
dataSourceTransactionManagerStack.push(dataSourceTransactionManager);
}
return true;
}
private void commit(Stack
Stack
while (!dataSourceTransactionManagerStack.isEmpty()) {
dataSourceTransactionManagerStack.pop().commit(transactionStatuStack.pop());
}
}
private void rollback(Stack
Stack
while (!dataSourceTransactionManagerStack.isEmpty()) {
dataSourceTransactionManagerStack.pop().rollback(transactionStatuStack.pop());
}
}
}
2.2 TransactionalControl
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
@Target({ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface TransactionalControl {
String[] name() default {"basetx"};
}
3.获取spring容器中的bean
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static Object getBean(String beanName){
return applicationContext.getBean(beanName);
}
public static
return applicationContext.getBean(beanClass);
}
public static
return applicationContext.getBean(beanName,beanClass);
}
}



