簡單單解決你的事務回滾問題

/**
     * 用戶登錄接口
     * 
     * 
     * 1明確事務方法前的命名規則
     * 2保證事務方法執行的時間儘可能的短,不允許出現循環操作,不允許出現RPC等網絡請求操作
     * 3不允許所有的方法都使用事務,節省服務器性能和縮短數據庫連接時間
     * 4如果出現有多個地方需要事務回滾時,使用自定義或原有的異常進行拋出,異常必須繼承RunTimeError,否則不會觸發回滾操作
     * 5使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();進行手動回滾
     * 
     */
    @Transactional
    public UserModel login(UserModel user){
        
        UserModel userEntity = new UserModel();
        
        
        userEntity = userDao.login(user);
        if(userEntity == null)
        {
            return null;
        }
        
        userEntity = userDao.login(user);
        if(userEntity == null)
        {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return null;
        }
        else
        {
            return userEntity;
        }
    }




直接給出一個例子代碼,上面只是記錄一下,下面纔是乾貨。

首先很多時候我們不會採用事務操作,但是當我們在一個服務層多次訪問數據庫特別是進行插入刪除操作的時候,我們需要使用事務進行操作,也就是一個不成功,所有的操作全部回滾。

那麼具體的事務特性我就不多說了,規範我也打在最上面的註釋裏面了。主要注意一下,

使用@Transactional 註解

如果第一次插入成功,第二次插入失敗,執行TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 這條語句之後,第一次的插入動作就被回滾了,也就是並沒有生效。

手動回滾看起來會比較實用一些。

然後對於拋出異常的那種自動回滾可以參考百度各種代碼。比較麻煩一些,就不列舉了。

 

補充一下:

使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();  設置回滾點,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滾到savePoint。
 
 
後序補充詳細屬性配置(複雜)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章