@Transactional註解詳細使用

 

一、@Transactional 註解使用

              1. @Transactional  註解只能用在public 方法上,如果用在protected或者private的方法上,不會報錯,但是該註解不會生效。

             2. @Transactional註解只能回滾非檢查型異常,具體爲RuntimeException及其子類。

             3. 使用rollbackFor 屬性來定義回滾的異常類型,使用 propagation 屬性定義事務的傳播行爲。如:

              回滾Exception類的異常,事務的傳播行爲支持當前事務,如果沒有事務,那麼會創建一個事務。

             4. @Transactional註解不能回滾被try{}catch() 捕獲的異常。

 @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)

           

 

二、 Spring事務的傳播行爲

 1)PROPAGATION_REQUIRED   :  支持當前事務,如果當前沒有事務,則創建一個事務,這是最常見的選擇。 

               2)PROPAGATION_SUPPORTS   :  支持當前事務,如果當前沒有事務,就以非事務來執行。

               3)PROPAGATION_MANDATORY  :  支持當前事務,如果沒有當前事務,就拋出異常。     

               4)PROPAGATION_REQUIRES_NEW :   新建事務,如果當前存在事務,就把當前事務掛起。

               5)PROPAGATION_NOT_SUPPORTED :  以非事務執行操作,如果當前存在事務,則當前事務掛起。 

               6)PROPAGATION_NEVER :  以非事務方式執行,如果當前存在事務,則拋出異常。

               7)PROPAGATION_NESTED :  如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED 類似的操作。

 

三、開發案例

workflow服務, 設置的事務傳播行爲爲 :REQUIED

 

payment服務添加註解: 回滾所有的異常。

 

Feign:

package com.hand.hcf.app.workflow.client.extraApi;

import com.hand.hcf.app.workflow.approval.dto.CashTransactionDataCreateCO;
import com.hand.hcf.app.workflow.brms.dto.ApprovalDocumentWithValuesCODTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * PaymentInterface
 *
 * @Auther: zhengbing.zhang
 * @Date:2019/8/19
 * @remark
 */
@FeignClient(
        name = "${hcf.application.payment.name:fec-payment}",
        url = "${hcf.application.payment.url:}",
        contextId = "PaymentInterface"
)
public interface PaymentInterface {

    @PostMapping({"/api/implement/payment/cash/transactionData/batch/v2"})
    void saveTransactionDatasBatch(@RequestBody List<ApprovalDocumentWithValuesCODTO> cashTransactionDatas);


    @GetMapping("/api/acp/requisition/header/update/status/by/documentNumber")
    void updateDocumentStatusByDocumentNumber(
            @RequestParam("documentNumber") String documentNumber
            ,@RequestParam("status") Integer status);


}

 

測試:

  workflow 調用payment服務的saveTransactionDatasBatch方法, 然Payment服務報錯,workflow服務收到錯誤後回滾:

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