Controller中的bean是由SpringMVC容器来管理的,所以不会生效,一般不在Controller中开启事务,想要生效需要做一些配置。
@RequestMapping("/t/user") @Transactional public String getUser() throws Exception { testSuccess(); return "hello"; }
public void testInternal() throws Exception { testSuccess(); } // 正常情况 @Transactional(rollbackFor = Exception.class) public void testSuccess() throws Exception { User user = userMapper.selectById(1); System.out.println(user); user.setName("kelly"); userMapper.update(user); System.out.println(userMapper.selectById(1)); throw new Exception("事务生效"); }
@Transactional(rollbackFor = Exception.class) public void testInternal() throws Exception { testSuccess(); }
如果像上例一样throw的Exception,属于CheckedException,需要指定rollbackFor,不然事务还是不会生效。
Spring会为加了@Transaction的方法生成代理对象是开启事务、提交/回滚事务。但是直接取调用没有加@Transaction的方法就是一个普通方法,Spring生成的代理对象没有方法中没有事务处理。
这种情况idea已经提示异常了。