使用第一種方法(省略了操作數據庫的代碼)操作Mybatis Plus的事務,若出現異常進入catch之後,不會執行數據庫操作的回滾,反而會報No transaction aspect-managed TransactionStatus in scope的錯誤,修改爲第二種可以正常進行事務管理和回滾
看到一個關於此情況的解釋:
@Transactional 必須觸發aop代理才能生效,故非public方法,不執行事務,public方法在本類中被引用,也不執行事務
第一種方法:
@PostMapping("/save1")
public boolean action01() {
return action00();
}
@PostMapping("/save2")
public boolean action02() {
return action00();
}
@Transactional
private boolean action00() {
String result = true;
try {
System.out.println(1/0);
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
result = false;
}
return result;
}
第二種方法:
@PostMapping("/save1")
@Transactional
public boolean action01() {
boolean result = action00();
if (!result){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
@PostMapping("/save2")
@Transactional
public boolean action02() {
boolean result = action00();
if (!result){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return result;
}
private boolean action00() {
String result = true;
try {
System.out.println(1/0);
} catch (Exception e) {
result = false;
}
return result;
}