多数据源,手动事务注解

获取容器中的bean

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    public static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.applicationContext =   applicationContext;
    }
}

数据源配置

@Configuration
@EnableTransactionManagement
public class Gxzd37DataSourceConfig {

    /**
     * 数据源37
     */
    @Bean(name = "dataSource37")
    @ConfigurationProperties(prefix = "spring.37datasource.druid")
    public DruidDataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "jdbcTemplate37")
    public JdbcTemplate jdbcTemplate(@Qualifier("dataSource37") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "namedParameterJdbcTemplate37")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("dataSource37") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
    @Bean("transactonManager37")
    public PlatformTransactionManager getTransactionManager(@Qualifier("dataSource37")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}




@Configuration
@EnableTransactionManagement
public class Gxzd47DataSourceConfig {

    /**
     * 数据源47
     */
    @Bean(name = "dataSource47")
    @ConfigurationProperties(prefix = "spring.gxzd47datasource.druid")
    public DruidDataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "jdbcTemplate47")
    public JdbcTemplate jdbcTemplate(@Qualifier("dataSource47") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "namedParameterJdbcTemplate47")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("dataSource47") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
    @Bean("transactonManager47")
    public PlatformTransactionManager getTransactionManager(@Qualifier("dataSource47")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
}

 

事务注解

/**
 * @description: 共享字典手动事务注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface GxzdTranstionManager {
    String[] transactonManagers() default {};
}

 

切面类

@Component
@Aspect
@Order(-1)
public class GxzdTranstionManagerAOP{

    @Pointcut(value = "@annotation(cn.crl.zdgl.config.GxzdTranstionManager)")
    public void methodPointcut(){}

    @Around(value = "methodPointcut()")
    public Object transactionalAspectAround(ProceedingJoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature)point.getSignature();
        Method method = signature.getMethod();
        GxzdTranstionManager annotation = method.getAnnotation(GxzdTranstionManager.class);
        String[] managers = annotation.transactonManagers();

        // 放入栈中,保证先进后出,防止ransaction synchronization is not active
        Stack<PlatformTransactionManager> managerStack = new Stack<>();
        Stack<TransactionStatus> statusStack = new Stack<>();

        if(managers.length > 0){
            for (String managerName : managers) {
                PlatformTransactionManager manager = (PlatformTransactionManager)ApplicationContextUtil.applicationContext.getBean(managerName);
                TransactionStatus transactionStatus = manager.getTransaction(new DefaultTransactionDefinition());
                managerStack.push(manager);
                statusStack.push(transactionStatus);
            }
        }
        try {
            Object proceed = point.proceed();

            while (!managerStack.isEmpty()){
                managerStack.pop().commit(statusStack.pop());
            }
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();

            while (!managerStack.isEmpty()){
                managerStack.pop().rollback(statusStack.pop());
            }
             throw new Exception(throwable);

        }
    }
}

 

业务类

@Service
public class Service {

  @Autowired
    @Qualifier("jdbcTemplate37")
    private JdbcTemplate jdbcTemplate37;
    @Autowired
    @Qualifier("jdbcTemplate47")
    private JdbcTemplate jdbcTemplate47;

 @GxzdTranstionManager(transactonManagers = {"transactonManager37","transactonManager47"})
    public Integer add(Object object){
  
        new OtherDao(jdbcTemplate37).add(object));
        new OtherDao(jdbcTemplate47).add(object));
        return 1;
    }

}

 

posted @ 2024-03-21 15:47  我没有出家  阅读(16)  评论(0编辑  收藏  举报