1. 程式人生 > >在事務方法中調用另外一個事務方法,被調用方法的事務沒起作用

在事務方法中調用另外一個事務方法,被調用方法的事務沒起作用

isa ont boot args test rar www user utils

在事務方法中調用另外一個事務方法,被調用方法的事務沒起作用

問題描述:(例)

  service層有兩個事務方法insertUser1、insertUser2, 當在insertUser1中調用insertUser2是,如果前面 方法異常,後邊方法不會保存

  期望:不管insertUser1是否報錯,insertUser2 都要報存數據

    @Transactional(propagation = Propagation.REQUIRED)
    public void insertUser1(){
        User user = new User("niu","男",19,"1000000");
        userDao.insertUser(user);

        
this.insertUser2(); //異常 int a = 10/0; } @Transactional(propagation = Propagation.REQUIRES_NEW) public void insertUser2(){ User user = new User("xing","女",19,"1111111"); userDao.insertUser(user); }

產生問題的原因是:spring是通過代理代管理事務的,當在第一個方法insertUser1內直接調用insertUser2的時候 ,insertUser2上的事務是不會起作用的(也就是insertUser2是沒有開啟事務)

解決:

springboot:開始aop事務,在啟動類application上添加註解@EnableAspectJAutoProxy(exposeProxy = true)

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
public class TestbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestbootApplication.class
, args); } }

同時在調用insertUser2時不直接調用,而是通過代理的方式調用:

將代碼修改:

    @Transactional(propagation = Propagation.REQUIRED)
    public void insertUser1(){
        User user = new User("niu","男",19,"1000000");
        userDao.insertUser(user);

        //this.insertUser2();
        ((UserService)AopContext.currentProxy()).insertUser2();
        //異常
        int a = 10/0;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void insertUser2(){
        User user = new User("xing","女",19,"1111111");
        userDao.insertUser(user);
    }

這樣在調用insertUser2的時候回起用事務管理(((UserService)AopContext.currentProxy()).insertUser2();方法的時候,會將當前事務掛起,重新開啟另一個新的事務來執行語句

可以通過以下代碼來判斷類是否是代理類:

boolean isProxy = AopUtils.isAopProxy((UserService)AopContext.currentProxy());
true:是代理類
false:不是代理類

詳細博客:https://www.cnblogs.com/micrari/p/7612962.html

在事務方法中調用另外一個事務方法,被調用方法的事務沒起作用