日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Spring中@Transactional注解事務傳播行為propagation參數說明

作者:丶只有影子 更新時間: 2023-07-04 編程語言

說明

在SpringBoot項目中,我們通常使用@Transactional 去進行事務控制,而@Transactional 注解中,有個比較關鍵的屬性就是propagation。在一個多事務的環境中,一個事務方法調用另一個事務方法時,就會涉及到事務的傳播行為,該屬性用來控制一段代碼經過多個@Transactional注解生效(同一個類的不同方法調用@Transactional是不會生效的)的方法的事務傳播機制。

對應源碼:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
	/**
	 * The transaction propagation type.
	 * <p>Defaults to {@link Propagation#REQUIRED}.
	 * @see org.springframework.transaction.interceptor.TransactionAttribute#getPropagationBehavior()
	 */
	Propagation propagation() default Propagation.REQUIRED;
}

由源碼可知,他是用來指定@Transactional事務傳播類型,在不指定的情況下,默認值為Propagation.REQUIRED

而查看Propagation可知,一共有以下7個屬性。

/**
 * Enumeration that represents transaction propagation behaviors for use
 * with the {@link Transactional} annotation, corresponding to the
 * {@link TransactionDefinition} interface.
 */
public enum Propagation {
	REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),

	SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),

	MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),

	REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),

	NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),

	NEVER(TransactionDefinition.PROPAGATION_NEVER),

	NESTED(TransactionDefinition.PROPAGATION_NESTED);
}

每個屬性的作用

1.REQUIRED:

默認的傳播行為,如果當前存在事務,則加入到當前事務中,如果沒有事務,則創建一個新的事務。

這是最常用的選項,適用于大多數業務情況。

2.REQUIRES_NEW

每次都會創建一個新的事務,如果當前存在事務,則將其掛起。這樣,每個方法都在自己的事務中運行,互相獨立。

使用場景:多個用戶同時請求分配某些共享資源,如飛機座位、酒店房間等。你可能希望每個用戶的分配操作都在獨立的事務中進行,以避免資源沖突問題。使用 REQUIRES_NEW 隔離級別可以確保每個用戶的資源分配操作都是獨立的,不受其他用戶的操作干擾。

3.SUPPORTS

如果當前存在事務,則加入到當前事務中,如果沒有事務,則以非事務方式執行。這個選項適用于不需要強制要求事務的方法,可以根據上下文自由選擇是否使用事務。

4.NOT_SUPPORTED

以非事務方式執行方法,如果當前存在事務,則將其掛起。適用于不需要事務支持的方法,例如只進行讀取操作的方法。

使用場景:有時候我們需要執行一些不需要事務支持的操作,例如在調用遠程接口時立刻插入一條日志記錄,而不會因為后面的異常,導致事務回滾,調用日志沒有留下;或者是插入防重表時,不開啟使用直接插入,保證多個事務同時插入同一主鍵的數據時,能夠快速失敗,快速拋錯,防止無用處理。

5.MANDATORY

要求當前存在事務,否則拋出異常。適用于必須在事務中運行的方法,如果沒有事務,則拋出異常。

使用場景:較為重要的,必須開啟事務的,較為底層代碼,防治被不開啟事務調用。

6.NEVER:

要求當前沒有事務,否則拋出異常。適用于必須在非事務中運行的方法,如果存在事務,則拋出異常。

使用場景:方法內的數據庫操作不希望參與事務,例如插入一條數據時,希望被其他服務或者線程立刻讀取到。

7.NESTED

如果當前存在事務,則在當前事務的嵌套事務中執行。如果沒有事務,則創建一個新的事務。這個選項適用于需要在事務內部進行嵌套事務的方法。

原文鏈接:https://blog.csdn.net/weixin_43811294/article/details/131447149

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新