我們現在進行事務控制一般都是使用註解型事務,然而有些時候卻會發現註解型事務失效了。比如下方的這種情況:
@Transactional(propagation= Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
@Override
public void batchInsertUserInfo(List<User> users){
userMapper.batchInsert(users);
}
一般來說,在批量插入出錯的時候會執行回滾操作,然而事實上,事務失效了,在出錯的時候沒有執行回滾操作。
找了下原因,發現是因爲定義了一個全局異常處理器已經對異常進行了處理。
public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
/* 處理代碼 */
}
}
那這種情況又明顯不符合業務需求,就可以手動進行事務的回滾操作。
public void batchInsertUserInfo(List<User> users){
//獲取事物管理器
DataSourceTransactionManager transactionManager=SpringContextUtil.getBean(DataSourceTransactionManager.class);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級別,開啓新事務.
TransactionStatus status = transactionManager.getTransaction(def); // 獲得事務狀態
try{
userMapper.batchInsert(users);
transactionManager.commit(status);
}catch(Exception e){
log.error("batchInsert user fail",e)
transactionManager.rollback(status);
}
}
這樣一來使用手動事務控制,事務不能回滾的問題就解決了。