手動事務提交

我們現在進行事務控制一般都是使用註解型事務,然而有些時候卻會發現註解型事務失效了。比如下方的這種情況:

@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);
       }
    }

這樣一來使用手動事務控制,事務不能回滾的問題就解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章