原因:某个业务类上被挂了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)事务只读,这样可以么
去掉类上面的注解,改为除了不加注解的那个方法,其他的都加上这个注解
注解解析的时候,优先使用方法上的注解,你这不可以为所欲为了?
弄个aop增强那个方法,然后在aop里自定义事务模式
NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。