一、@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服務收到錯誤後回滾: