springboot的Transactional怎么关闭指定方法的事务?

原因:某个业务类上被挂了Transactional注解。
现在有个问题,我想让其中的某个方法关闭事务。
因为太影响性能了。
但是我又不好删除类上的注解(懂的都懂),所以有啥办法不?

自定义一个排除注解就可以了


    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Exclude{
        
    }
    
    public class Bpf implements BeanDefinitionRegistryPostProcessor{
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            registry.removeBeanDefinition("transactionAttributeSource");
            AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(AnnotationTransactionAttributeSource.class).setRole(2).getBeanDefinition();
            AnnotationMethodMatcher methodMatcher = new AnnotationMethodMatcher(Exclude.class);
            beanDefinition.setInstanceSupplier(() -> new AnnotationTransactionAttributeSource(){

                @Override
                public TransactionAttribute getTransactionAttribute(Method method, Class<?> targetClass) {
                    if(methodMatcher.matches(method,targetClass==null?method.getDeclaringClass():targetClass)){
                        return null;
                    }
                    return super.getTransactionAttribute(method, targetClass);
                }

            });
            registry.registerBeanDefinition("transactionAttributeSource", beanDefinition);
        }

        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        }

    }

看下spring事务的传播机制中是否有合适的选项,或者启动一个线程去执行你那个方法,线程不要交给spring管理,已匿名内部类的方式启动,像这样new Thread(() -> {}),很奇怪,难道你们这个业务不需要保证业务完整和数据一致性吗?如果不需要保证那刚脆就异步处理算了,在controller中直接启动一个线程,调用service里面的这个方法

@Transactional(readOnly = true)事务只读,这样可以么

去掉类上面的注解,改为除了不加注解的那个方法,其他的都加上这个注解

注解解析的时候,优先使用方法上的注解,你这不可以为所欲为了?

img

弄个aop增强那个方法,然后在aop里自定义事务模式

NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。