一、@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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1ATNxMjNwATM3EjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
payment服務添加注解: 復原所有的異常。
用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服務收到錯誤後復原: