1. 程式人生 > >sping事物(一個事物方法裡面呼叫另一個REQUIRES_NEW事物問題)

sping事物(一個事物方法裡面呼叫另一個REQUIRES_NEW事物問題)

如果一個事物裡面呼叫另一個新增方法事物相關:

eg:
    @Transactional
    public Integer addUser(User user) {
        Integer result = userDAO.addUser(user);
        try {

            User u2=new User(2,"電風扇地方","123pass","123app");
            this.insertUser(u2);
        }catch (Exception e){
            System.err.println(e);
        }
        return result;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public Integer insertUser(User user) {
        Integer result = userDAO.insertUser(user);
        int i=1/0;
        return result;
    }
addUser()方法裡面呼叫了insertUser()方法預設開啟一個新增事物,理想狀態是user2插入失敗,user1插入成功。結果不符。

解決方案:

xml檔案設定:

<!--暴露aop代理到ThreadLocal-->

<aop:aspectj-autoproxy expose-proxy="true"/>

addUser()方法修改:

    @Transactional
    public Integer addUser(User user) {
        Integer result = userDAO.addUser(user);
        try {

            User u2=new User(2,"電風扇地方","123pass","123app");
//            this.insertUser(u2);
            //獲取當前AopContext 然後通過aop呼叫
            ((UserService)AopContext.currentProxy()).insertUser(u2);
        }catch (Exception e){
            System.err.println(e);
        }
        return result;
    }

問題解決。