網(wǎng)站首頁 編程語言 正文
事務(wù)傳播機制是什么?(定義)
Spring 事務(wù)傳播機制定義了多個包含了事務(wù)的?法,相互調(diào)?時,事務(wù)是如何在這些?法間進?傳遞的。總之,事務(wù)傳播機制就是多個事務(wù)在相互調(diào)用時,事務(wù)是如何進行傳遞的。
為什么需要事務(wù)傳播機制?
事務(wù)隔離級別是保證多個并發(fā)事務(wù)執(zhí)?的可控性的(穩(wěn)定性的),?事務(wù)傳播機制是保證?個事務(wù)在多個調(diào)??法間的可控性的(穩(wěn)定性的)。
并發(fā)事務(wù):多個事務(wù)同時調(diào)??個數(shù)據(jù)庫的問題
事務(wù)傳播機制:事務(wù)傳播機制解決的是?個事務(wù)在多個?法中傳遞的問題?
事務(wù)傳播機制有哪些?
Spring 事務(wù)傳播機制包含以下 7 種:
Propagation.REQUIRED:默認的事務(wù)傳播級別,它表示如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建?個新的事務(wù)。
Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則以?事務(wù)的?式繼續(xù)運?。
Propagation.MANDATORY:(mandatory為強制性的)如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。
Propagation.REQUIRES_NEW:表示創(chuàng)建?個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說不管外部?法是否開啟事務(wù),Propagation.REQUIRES_NEW 修飾的內(nèi)部?法會新開啟??的事務(wù),且開啟的事務(wù)相互獨?,互不?擾。
Propagation.NOT_SUPPORTED:以?事務(wù)?式運?,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
Propagation.NEVER:以?事務(wù)?式運?,如果當(dāng)前存在事務(wù),則拋出異常。
Propagation.NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建?個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運?;如果當(dāng)前沒有事務(wù),則該取值等價于 PROPAGATION_REQUIRED。
根據(jù)是否?持當(dāng)前事務(wù)分為以下3類:
Spring事務(wù)的傳播機制使用示例:(演示加入事務(wù)REQUIRED和嵌套事務(wù)NESTED)
加入事務(wù)REQUIRED示例:
controller代碼如下:
?
UserService代碼如下:?
?
LogInfoService代碼如下:
?執(zhí)行結(jié)果如下:?
?
?此時會發(fā)現(xiàn)用戶表和日志表都已經(jīng)添加成功了,這是在沒有異常的情況下。再次清除數(shù)據(jù),我們手動在LogInfoService代碼中構(gòu)造一個算術(shù)異常,其他代碼不變,再次運行,再來看數(shù)據(jù)表的變化:?
?
在數(shù)據(jù)庫中可以發(fā)現(xiàn)用戶表和日志表都沒有添加成功。
小結(jié):
加入當(dāng)前事務(wù):@Transactional(propagation = Propagation.REQUTRED)
方法調(diào)用流程: controller/add1?-〉用戶添加方法->日志添加方法
當(dāng)日志添加方法出現(xiàn)異常之后,加入事務(wù)的執(zhí)行結(jié)果是:
1、用戶添加成功的數(shù)據(jù)也回滾了
2. 日志添加成功的數(shù)據(jù)也回滾了
嵌套事務(wù)NESTED示例:
此示例與上面代碼基本一樣,只是傳播機制設(shè)置不一樣:
?
?在無異常情況下,數(shù)據(jù)均可以添加成功,執(zhí)行結(jié)果如下:
?再次清除數(shù)據(jù),我們手動在LogInfoService代碼中構(gòu)造一個算術(shù)異常,其他代碼不變,再次運行,再來看數(shù)據(jù)表的變化:
執(zhí)行結(jié)果如下:
?
小結(jié):
嵌套事務(wù):@Transactional(propagation = Propagation.NESTED)
方法調(diào)用流程: controller/add1?-〉用戶添加方法->日志添加方法
當(dāng)日志添加方法出現(xiàn)異常之后,嵌套事務(wù)的執(zhí)行結(jié)果是:
1、用戶數(shù)據(jù)添加成功了
2. 日志添加成功的數(shù)據(jù)回滾了
嵌套事務(wù)(NESTED)和加?事務(wù)(REQUIRED )的區(qū)別:?
整個事務(wù)如果全部執(zhí)?成功,?者的結(jié)果是?樣的。如果事務(wù)執(zhí)?到?半失敗了,那么加?事務(wù)整個事務(wù)會全部回滾;?嵌套事務(wù)會局部回滾,不會影響上?個?法中執(zhí)?的結(jié)果。
總結(jié):
1. 在 Spring 項?中使?事務(wù),?兩種?法,?動操作和聲明式?動提交,其中后者使?的最多,在?法上添加 @Transactional 就可以實現(xiàn)了。
2. 設(shè)置事務(wù)的隔離級別 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事務(wù)隔離級別有 5 種。
3. 設(shè)置事務(wù)的傳播機制 @Transactional(propagation = Propagation.REQUIRED),Spring 中的事務(wù)傳播級別有 7 種。
原文鏈接:https://blog.csdn.net/crazy_xieyi/article/details/130697747
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-08-15 初步了解MyBatis的相關(guān)配置
- 2023-01-29 Python??序列化反序列化和異常處理的問題小結(jié)_python
- 2023-07-22 JVM的類加載機制和垃圾回收機制
- 2022-07-31 C語言算法積累加tag的循環(huán)隊列_C 語言
- 2023-11-22 Linux/Ubuntu下如何刪除文件或者目錄
- 2022-07-13 Stream的源碼簡單解析
- 2023-04-24 React組件與事件的創(chuàng)建使用教程_React
- 2022-01-20 npm 報錯: npm ERR! code ERESOLVE , npm ERR! code E40
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支