serviceA的方法
@Override
@Transactional(rollbackFor = Exception.class)
public List<String> importProject(MultipartFile file, Long userId) throws CustomException, IOException {
if (file.isEmpty()) throw new CustomException("檔案不存在!", Constants.FILE_EMPTY_RESPONSE);
List<Map<Integer, String>> data = POIExcelReader.readExcelContent(file.getInputStream(), file.getOriginalFilename(), 1, 17);
if (CollectionUtils.isEmpty(data)) {
throw new CustomException("未獲取到匯入資料", Constants.NORMAL_ERROR_RESPONSE);
}
log.info("匯入的模版資料長度--->" + data.size());
return importService.importProject(data, userId);
}
serviceB的方法
@Override
@Transactional(rollbackFor = Exception.class)
public List<String> importProject(MultipartFile file, Long userId) throws CustomException, IOException {
if (file.isEmpty()) throw new CustomException("檔案不存在!", Constants.FILE_EMPTY_RESPONSE);
List<Map<Integer, String>> data = POIExcelReader.readExcelContent(file.getInputStream(), file.getOriginalFilename(), 1, 17);
if (CollectionUtils.isEmpty(data)) {
throw new CustomException("未獲取到匯入資料", Constants.NORMAL_ERROR_RESPONSE);
}
log.info("匯入的模版資料長度--->" + data.size());
return importService.importProject(data, userId);
}
一模一樣。呼叫也是在一個地方分開呼叫。挨個測驗的。結果一個例外回滾,另一個卻例外不回滾.
uj5u.com熱心網友回復:
這個問題的可能性應該是在呼叫的源頭,舉個例子來說明一下現在有兩個service --ServiceA和ServiceB,ControllerA和ControllerB,ControllerA呼叫ServiceA,像你這樣配置@Transactional(rollbackFor = Exception.class)這個時候事務生效,報錯會混滾,同理ControllerB呼叫ServiceB也是一樣
現在有一個ControllerC,還有一個ServiceC,ServiceC上配置是@Transactional(這里沒有寫rollbackFor),當ControllerC呼叫ServiceC,ServiceC呼叫ServiceA或者ServiceB,這時如果程式不是拋出RunTimeException的話就不會回滾了(你的CustomException不是繼承RunTimeException),為什么不會回滾呢?因為spring默認的傳播行為是PROPAGATION_REQUIRED,表示當前有事務就支持當前事務了,所以最終起效的事務時ServiceC的事務,而ServiceC上并沒有配置回滾
uj5u.com熱心網友回復:
抱歉,上面的可能說的是錯誤的,記憶不是很清晰了
uj5u.com熱心網友回復:
可能我寫的不是太清晰, ServiceA和ServiceB的方法都是呼叫ServiceC的訪問,并且ServiceA和ServiceB的方法寫的都一致,在Controller里呼叫ServiceA是例外無回滾的,呼叫ServiceB是例外回滾的。 經過后面的測驗,發現ServiceA的整個類里面都無法回滾,寫了個最簡單的例子都無法回滾,暫時還未找到問題原因,并且ServiceA類的注解只有@service和@slf4j 兩個.ServiceB里也一樣.不知道有沒有可能出現一種可能,同一個Service里的其他方法會影響到我呼叫的方法.實際上ServiceA里被呼叫的方法是沒有呼叫本類里的任何方法.沒找到問題根本!uj5u.com熱心網友回復:
現在需要知道的一個問題是什么原因可以導致整個Service都無法回滾。 暫時還不知道原因!uj5u.com熱心網友回復:
說無法回滾不太準確,再深一點的說是事務都已經無效了。使用手動強制回滾.會出現No transactionuj5u.com熱心網友回復:
那大概是serviceA中事務沒有得到增強啦,看下包的掃描路徑對不對啊,@Transactional可能沒生效呢uj5u.com熱心網友回復:
