阿里手冊異常日志篇:【強制】有 try 塊放到了事務代碼中,catch 異常后,如果需要回滾事務,一定要注意手動回滾事務。
容易讓人忽略的是:方法上未加任何屬性的@Transactional注解只能在拋出RuntimeException或者Error時才會觸發事務的回滾,常見的非RuntimeException是不會觸發事務的回滾的。
避免失效有如下幾種方式:
1. 使用@Transactional(rollbackFor = Exception.class)注解,前提是不含有try{...}catch{...}捕獲異常。
2. 使用@Transactional注解,不帶任何屬性,拋出@Transactional注解默認識別的RuntimeException
@Transactional
public String getUserInfo() {
try {
//do something
return "成功信息";
} catch (Exception e) {
e.printStackTrace();
//異常處理這里采用lombok
log.error("異常日志", e.getMessage());
//拋出異常
throw new RuntimeException();
}
}
弊端:非運行時異常不會回滾
3.使用@Transactional(rollbackFor = { Exception.class }),也能拋出捕獲的非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;
}
}
4.手動回滾
阿里規約硬性要求的
@Transactional
public String getUserInfo() {
try {
//do something
return "成功信息";
} catch (Exception e) {
e.printStackTrace();
//異常處理這里采用lombok
log.error("異常日志", e.getMessage());
//手動回滾
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "自定義異常信息";
}
}
