sping事物(一個事物方法裡面呼叫另一個REQUIRES_NEW事物問題)
阿新 • • 發佈:2018-12-21
如果一個事物裡面呼叫另一個新增方法事物相關:
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; }
問題解決。