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

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

Spring事務(wù)的傳播機制

作者:crazy_xieyi 更新時間: 2023-07-10 編程語言

事務(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

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