一、@Transactional 注解使用
- @Transactional 注解只能用在public 方法上,如果用在protected或者private的方法上,不會報錯,但是該注解不會生效。
- @Transactional注解只能回滾非檢查型異常,具體為RuntimeException及其子類。
- 使用rollbackFor 屬性來定義回滾的異常類型,使用 propagation 屬性定義事務的傳播行為。如:
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
//回滾Exception類的異常,事務的傳播行為支持當前事務,如果沒有事務,那么會創建一個事務。
- @Transactional注解不能回滾被try{}catch() 捕獲的異
二、 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服務添加注解: 回滾所有的異常。
Fegin:
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服務收到錯誤后回滾: