@Override public void test1() { MaterialQuestionnaire materialQuestionnaire=new MaterialQuestionnaire(); materialQuestionnaire.setUpAt(LocalDateTime.now()); materialQuestionnaire.setMaterialId("t1"); materialQuestionnaire.setDescription("测试"); this.save(materialQuestionnaire); test2(); } @Override @Transactional public void test2() { MaterialQuestionnaire materialQuestionnaire=new MaterialQuestionnaire(); materialQuestionnaire.setUpAt(LocalDateTime.now()); materialQuestionnaire.setMaterialId("t2"); materialQuestionnaire.setDescription("测试"); this.save(materialQuestionnaire); int a=1/0; } 同一个类中让test2的事务生效内容:要让test2方法的事务生效,可以在调用test2方法的地方添加一个代理对象,通过代理对象来调用test2方法。

首先,需要在类中注入一个代理对象来调用test2方法。可以使用Spring的AOP功能来实现代理。在类上添加注解@EnableAspectJAutoProxy来启用Spring的AOP功能。

然后,创建一个切面类,在切面类中定义一个使用@Transactional注解的方法,该方法会在调用test2方法之前执行。在该方法中使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()来设置事务回滚。

最后,在调用test2方法的地方,通过代理对象来调用该方法。

以下是修改后的代码示例:

import org.springframework.aop.framework.AopContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

@Component
@EnableAspectJAutoProxy
public class MyClass {
    public void test1() {
        MaterialQuestionnaire materialQuestionnaire = new MaterialQuestionnaire();
        materialQuestionnaire.setUpAt(LocalDateTime.now());
        materialQuestionnaire.setMaterialId("t1");
        materialQuestionnaire.setDescription("测试");
        this.save(materialQuestionnaire);
        ((MyClass)AopContext.currentProxy()).test2();
    }

    @Transactional
    public void test2() {
        MaterialQuestionnaire materialQuestionnaire = new MaterialQuestionnaire();
        materialQuestionnaire.setUpAt(LocalDateTime.now());
        materialQuestionnaire.setMaterialId("t2");
        materialQuestionnaire.setDescription("测试");
        this.save(materialQuestionnaire);
        int a = 1 / 0;
    }

    private void save(MaterialQuestionnaire materialQuestionnaire) {
        // 保存逻辑
    }
}

注意:为了让AopContext.currentProxy()方法生效,需要在Spring配置文件中添加<aop:aspectj-autoproxy proxy-target-class="true"/>来开启CGLIB代理。

Spring AOP 事务控制:同一个类中让 test2 方法的事务生效

原文地址: https://www.cveoy.top/t/topic/qnCI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录