天天看點

@Transactional注解詳細使用三、開發案例

一、@Transactional 注解使用

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

             2. @Transactional注解隻能復原非檢查型異常,具體為RuntimeException及其子類。

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

              復原Exception類的異常,事務的傳播行為支援目前事務,如果沒有事務,那麼會建立一個事務。

            4. @Transactional注解不能復原被try{}catch() 捕獲的異常。

            5. @Transactional注解隻能對在被Spring 容器掃描到的類下的方法生效。

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

 二、 Spring事務的傳播行為

PROPAGATION_REQUIRED    支援目前事務,如果目前沒有事務,則建立一個事務,這是最常見的選擇。 
PROPAGATION_SUPPORTS  支援目前事務,如果目前沒有事務,就以非事務來執行
PROPAGATION_MANDATORY  支援目前事務,如果沒有目前事務,就抛出異常。    
PROPAGATION_REQUIRES_NEW 建立事務,如果目前存在事務,就把目前事務挂起。
PROPAGATION_NOT_SUPPORTED 以非事務執行操作,如果目前存在事務,則目前事務挂起。 
PROPAGATION_NEVER  以非事務方式執行,如果目前存在事務,則抛出異常。
PROPAGATION_NESTED 如果目前存在事務,則在嵌套事務内執行。如果目前沒有事務,則進行與PROPAGATION_REQUIRED 類似的操作。

三、開發案例

workflow服務, 設定的事務傳播行為為 :REQUIED

@Transactional注解詳細使用三、開發案例

payment服務添加注解: 復原所有的異常。

@Transactional注解詳細使用三、開發案例

用feign實作workflow 服務調用Payment服務:

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
 *
 * @Date:2019/8/19
 * @remark
 */
@FeignClient(
        name = "payment",
        contextId = "PaymentInterface"
)
public interface PaymentInterface {

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


}
           

測試:

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

@Transactional注解詳細使用三、開發案例