阿里手册异常日志篇:【强制】有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
容易让人忽略的是:方法上未加任何属性的@Transactional注解只能在抛出RuntimeException或者Error时才会触发事务的回滚,常见的非RuntimeException是不会触发事务的回滚的。
避免失效有
@Transactional
public String getUserInfo() {
try {
//do something
return "成功信息";
} catch (Exception e) {
e.printStackTrace();
//异常处理这里采用lombok
log.error("异常日志", e.getMessage());
//抛出异常
throw new RuntimeException();
}
}
弊端:非运行时异常不会回滚
@Transactional(rollbackFor = Exception.class)
public String uploadFile() throws IOException {
InputStream input = null;
try {
input = new FileInputStream("F:\\BaiduNetdiskDownload\\1.jpg");
int data = input.read();
while (data != -1) {
System.out.print((char) data);
data = input.read();
}
//do something
return "成功信息";
} catch (Exception e) {
e.printStackTrace();
//异常处理这里采用lombok
log.error("异常日志", e.getMessage());
//抛出所捕获的异常
throw e;
}
}
阿里规约硬性要求的
@Transactional
public String getUserInfo() {
try {
//do something
return "成功信息";
} catch (Exception e) {
e.printStackTrace();
//异常处理这里采用lombok
log.error("异常日志", e.getMessage());
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "自定义异常信息";
}
}
参考链接:https://www.cnblogs.com/zjfjava/p/9963958.html
原文:https://www.cnblogs.com/ringbug/p/15074553.html