栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SSM 多数据源同一事务控制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SSM 多数据源同一事务控制

整合

springboot基于注解动态配置多数据源以及多数据源的事务统一 - 炫舞风中 - 博客园

Spring多数据源事务管理_bug猫的博客-CSDN博客_spring多数据源事务管理 两位博有中出现的不足,进行优化后得出新的总结,废话不多说 直接上代码, 本人亲测有效

1.application.xml 数据源配置


            destroy-method="close">
         
          
         
       


        
        
        
        
        
        
        
        
        
        

        
        
    
    
      
         
         
            public void pointcut() {};


    @Around(value = "pointcut()&&@annotation(annotation)")
    public Object twiceAsOld(ProceedingJoinPoint point, TransactionalGroup annotation) throws Throwable {
        Stack dataSourceTransactionManagerStack = new Stack();
        Stack transactionStatuStack = new 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 dataSourceTransactionManagerStack,
                                    Stack transactionStatuStack, TransactionalGroup multiTransactional) {

        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 dataSourceTransactionManagerStack,
                        Stack transactionStatuStack) {
        while (!dataSourceTransactionManagerStack.isEmpty()) {
            dataSourceTransactionManagerStack.pop().commit(transactionStatuStack.pop());
        }
    }
   
    private void rollback(Stack dataSourceTransactionManagerStack,
                          Stack transactionStatuStack) {
        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 T getBean(Class beanClass) {
        return applicationContext.getBean(beanClass);
    }

   
    public static T getBean(String beanName, Class beanClass){
        return applicationContext.getBean(beanName,beanClass);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/338003.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号