トランザクションのシナリオでは、例外処理は、明示的にトランザクションをロールバックすることを忘れないでください

アリババの「Java開発マニュアル」:あなたは、ロールバックトランザクションを手動でロールバックすることを確認する必要がある場合は、トランザクションのシーンは、漁獲後にスローされました。

 

方法は全体的に、メモを作成して、割引の契約を作成する必要割り引く次のリリースでは、トランザクションです。キャッチキャッチ例外の後、明示的にDBに提出し、「作成ノート」の前、その後、ロールバックされていない場合。だから、トランザクションの一貫性を確保するためには、手動でトランザクションをロールバックする必要があり、最高の単一故障を返します。

パブリック クラスTradeOrderServiceImpl { 
    @Autowired 
    TradeOrderServiceImpl tradeOrderService。

    @Autowired 
    DraftInfoServiceImpl draftInfoService。
    
    / ** 
     *发布贴现
     * 
     * / 
    @Transactional 
    公共ResponseModel公開(文字列merId、列openBank、のBigDecimal AMT){ 
        DraftInfoModel draftInfoModel = 新しいDraftInfoModel()。
        draftInfoModel.setMerchantId(merId)。
        draftInfoModel.setAmt(AMT)。
        ... ... 
        // 创建票据 
        DraftInfoModel res_draftInfoModel = draftInfoService.addDraftInfo(draftInfoModel)。
        
        試し{ 
            TradeOrderModel tradeOrderModel = 新新TradeOrderModel(); 
            tradeOrderModel.setSellerMerchantId(merId); 
            tradeOrderModel.setOpenBank(openBank); // 異常データのopenBank長いMySQLの原因は列に切り捨て。
            tradeOrderModel.setPlatFeeAmt(AMT); 
            tradeOrderModel.setDraftId(res_draftInfoModel.getDraftId()); 
            ... 
            // 割り引かトランザクションを作成します 
            TradeOrderModelRes tradeOrderModelRes = tradeOrderService.publishDraftDiscount(tradeOrderModel); 
        } キャッチ(例外E){
             // 手動バックロール総務
            TransactionAspectSupport.currentTransactionStatus()のsetRollbackOnly();.
             //が最も高い単一の障害を返す
            返さ 新新(ResponseModelをfalseに、ExceptionUtils.getMessage(E)); 
        } 
        
        // 最高の単一の完全返す
        リターン 新新(ResponseModel trueにします;)
    } 
}

 

おすすめ

転載: www.cnblogs.com/buguge/p/11304993.html