1、同一个类中调用
因为它们发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效。
错误案例:
/**
*
* 在同一个类中调用
*
*/
@RestController
public class InSameClass {
@Autowired
UserService userService;
@GetMapping("methodA")
public void methodA() {
methodB();
// 其他操作
}
@Transactional
public void methodB() {
// 写数据库操作
User user = new User();
user.setId(2);
user.setUserName("B");
userService.save(user);
throw new RuntimeException("异常");
}
}
2、回滚异常类不正确
错误案例:
@Service
public class ThrowExceptionService {
@Autowired
UserService userService;
// 正常回滚
//@Transactional(rollbackFor = Exception.class)
// 异常回滚
@Transactional
public void methodA() throws Exception {
// 写数据库操作
User user = new User();
user.setId(1);
user.setUserName("A");
userService.save(user);
throw new MyException("Exception异常");
}
}
3、异常被捕获
错误案例:
@Service
public class ThrowRuntimeExceptionService{
@Autowired
UserService userService;
// 正常回滚,不会正常插入到数据库
@Transactional
public void methodA() {
User user = new User();
user.setId(2);
user.setUserName("B");
userService.save(user);
throw new RuntimeException("异常");
}
// 回滚失败,会正常插入到数据库
@Transactional
public void methodA2() {
try{
User user = new User();
user.setId(2);
user.setUserName("B2");
userService.save(user);
throw new RuntimeException("异常");
}catch (Exception e){
System.out.println("错误");
}
}
}
4、没有被 Spring 管理
错误案例:
//@Service
public class NotSpringBeanService {
@Autowired
UserService userService;
@Transactional
public void methodA() {
// 写数据库操作
User user = new User();
user.setId(1);
user.setUserName("A");
userService.save(user);
throw new RuntimeException("Exception异常");
}
}