在事務方法中調用另外一個事務方法,被調用方法的事務沒起作用
阿新 • • 發佈:2019-03-10
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
在事務方法中調用另外一個事務方法,被調用方法的事務沒起作用