網站首頁 編程語言 正文
說明
在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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-01-20 docker是干什么的,docker常用命令每日一練
- 2022-03-28 詳解Python操作Excel之openpyxl_python
- 2022-09-22 MP(MyBaitsPlus)代碼生成器
- 2022-09-06 C語言常見排序算法之交換排序(冒泡排序,快速排序)_C 語言
- 2022-06-20 關于Golang獲取當前項目絕對路徑的問題_Golang
- 2022-12-11 Dos判斷文件夾是否存在,如果存在刪除,不存在創建_DOS/BAT
- 2022-12-12 Docker制作tomcat鏡像并部署項目_docker
- 2022-04-20 Python?設計模式創建型單例模式_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支