代码内部捕获了异常,导致 Aop 没有拦截到异常,从而认为是成功的,直接提交了事物,进而导致事物注解失效!
解决方法:在 catch 中手动回滚。
@RestController
@Slf4j
public class UserController {
@Resource
private UserMapper userMapper;
@GetMapping("/add/{name}")
@Transactional
public String addUser(@PathVariable String name) {
User user = new User(null, "憨憨", 23, "7545562369889401@qq.com", 0);
try {
int result = userMapper.insert(user);
// 程序报错
if ("error".equals(name)) {
int i = 1 / 0;
}
return result > 0 ? "ok" : "fail";
} catch (Exception e) {
log.error(e.getMessage());
// 手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "fail";
}
}
}