-
不声明rollbackFor,只回滚RuntimeException或者Error,如果此时抛出Exception异常是不会回滚的
@Override @Transactional //不声明rollbackFor,只回滚RuntimeException或者Error,如果此时抛出Exception异常是不会回滚的 public void test() throws Exception { User user = new User(); user.setId(1L); user.setName("xx"); updateById(user); throw new Exception("exception"); }
- 标注了@Transactional的方法不是public的
- 方法内部,通过try catch把异常吃掉了
- A方法内部调用B方法,B方法上加了@Translational。这是因为内部方法调用不走代理,而事务是由代理实现的,比如,下面这样:
@Override public void test(){ test2(); } @Transactional public void test2() { User user = new User(); user.setId(1L); user.setName("涂山小楼"); updateById(user); throw new RuntimeException("runtime exception"); }
那要怎么改才能让事务生效呢?很简单,让他走代理就行,比如,下面这样
@Override public void test(){ // 这样就会走代理,使事务生效 userService.test2(); } @Transactional public void test2() { User user = new User(); user.setId(1L); user.setName("涂山小楼"); updateById(user); throw new RuntimeException("runtime exception"); }
注意:@Transactional并不是一定要加在service上面,加在controller上面一样会事务回滚,比如,下面这样:
@GetMapping("/test") @Transactional public void test(){ userService.test(); }
Spring@Transactional注解在什么情况下事务不生效
最新推荐文章于 2023-08-15 18:23:56 发布