




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第深入了解Spring的事務(wù)傳播機(jī)制目錄Spring事務(wù)傳播機(jī)制有哪些?事務(wù)傳播機(jī)制使用與演示REQUIRED使用演示REQUIRED_NEW使用演示NESTED使用演示總結(jié)Spring事務(wù)傳播機(jī)制是指,包含多個(gè)事務(wù)的方法在相互調(diào)用時(shí),事務(wù)是如何在這些方法間傳播的。
既然是事務(wù)傳播,所以事務(wù)的數(shù)量應(yīng)該在兩個(gè)或兩個(gè)以上,Spring事務(wù)傳播機(jī)制的誕生是為了規(guī)定多個(gè)事務(wù)在傳播過(guò)程中的行為的。比如方法A開(kāi)啟了事務(wù),而在執(zhí)行過(guò)程中又調(diào)用了開(kāi)啟事務(wù)的B方法,那么B方法的事務(wù)是應(yīng)該加入到A事務(wù)當(dāng)中呢?還是兩個(gè)事務(wù)相互執(zhí)行互不影響,又或者是將B事務(wù)嵌套到A事務(wù)中執(zhí)行呢?所以這個(gè)時(shí)候就需要一個(gè)機(jī)制來(lái)規(guī)定和約束這兩個(gè)事務(wù)的行為,這就是Spring事務(wù)傳播機(jī)制所解決的問(wèn)題。
Spring事務(wù)傳播機(jī)制有哪些?
Spring事務(wù)傳播機(jī)制可使用@Transactional(propagation=Propagation.REQUIRED)來(lái)定義,Spring事務(wù)傳播機(jī)制的級(jí)別包含以下7種:
Propagation.REQUIRED:默認(rèn)的事務(wù)傳播級(jí)別,它表示如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。Propagation.MANDATORY:(mandatory:強(qiáng)制性)如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。Propagation.REQUIRES_NEW:表示創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說(shuō)不管外部方法是否開(kāi)啟事務(wù),Propagation.REQUIRES_NEW修飾的內(nèi)部方法會(huì)新開(kāi)啟自己的事務(wù),且開(kāi)啟的事務(wù)相互獨(dú)立,互不干擾。Propagation.NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。Propagation.NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。Propagation.NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于PROPAGATION_REQUIRED。
以上7種傳播機(jī)制,可根據(jù)是否支持當(dāng)前事務(wù)的維度分為以下3類(lèi):
看到這里,有人可能會(huì)說(shuō):說(shuō)了這么多,我也看不懂啊,即使看懂了,我也記不住?。窟@要咋整?
沒(méi)關(guān)系,接下來(lái)我們用一個(gè)例子,來(lái)說(shuō)明這3類(lèi)事務(wù)傳播機(jī)制的區(qū)別。
以情侶之間是否要買(mǎi)房為例,我們將以上3類(lèi)事務(wù)傳播機(jī)制可以看作是戀愛(ài)中的3類(lèi)女生類(lèi)型:
普通型強(qiáng)勢(shì)型懂事型
這三類(lèi)女生如下圖所示:
支持當(dāng)前事務(wù)的女生,這里的事務(wù)指的是房子,它分為3種(普通型女生):
Propagation.REQUIRED(需要有房子):有房子了咱們一起住,沒(méi)房子了咱們一起賺錢(qián)買(mǎi)房子。Propagation.SUPPORTS(可以有房子):有房子了就一起住,沒(méi)房子了咱們就一起租房子。Propagation.MANDATORY(強(qiáng)制有房子):有房子了就一起住,沒(méi)房子了就分手。
不支持當(dāng)前事務(wù)的女生也分為3種(強(qiáng)勢(shì)型或者叫事業(yè)型):
Propagation.REQUIRES_NEW:不要你的房子,必須一起賺錢(qián)買(mǎi)房子。Propagation.NOT_SUPPORTED:不要你的房子,必須一起租房子。Propagation.NEVER:必須一起租房子,你有房子就分手。
最后一種是嵌套性事務(wù)Propagation.NESTED,它屬于懂事型女友,如果有房子了就以房子為基礎(chǔ)做點(diǎn)小生意,賣(mài)個(gè)花生、水果啥的,如果買(mǎi)賣(mài)成了,那就繼續(xù)發(fā)展;如果失敗了,至少還有房子;如果沒(méi)房子也沒(méi)關(guān)系,一起賺錢(qián)買(mǎi)房子。
事務(wù)傳播機(jī)制使用與演示
接下來(lái)我們演示一下事務(wù)傳播機(jī)制的使用,以下面3個(gè)最典型的事務(wù)傳播級(jí)別為例:
支持當(dāng)前事務(wù)的REQUIRED;不支持當(dāng)前事務(wù)的REQUIRES_NEW;嵌套事務(wù)NESTED。
下來(lái)我們分別來(lái)看。
事務(wù)傳播機(jī)制的示例,需要用到以下兩張表:
--用戶表
CREATETABLE`user`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`name`varchar(255)COLLATEutf8mb4_binDEFAULTNULL,
`password`varchar(255)COLLATEutf8mb4_binDEFAULTNULL,
`createtime`datetimeDEFAULTCURRENT_TIMESTAMP,
PRIMARYKEY(`id`)USINGBTREE
)ENGINE=InnoDBAUTO_INCREMENT=6DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_binROW_FORMAT=DYNAMIC;
--日志表
CREATETABLE`log`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`content`textNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_bin;
創(chuàng)建一個(gè)SpringBoot項(xiàng)目,核心業(yè)務(wù)代碼有3個(gè):UserController、UserServcie以及LogService。在UserController里面調(diào)用UserService添加用戶,并調(diào)用LogService添加日志。
REQUIRED使用演示
REQUIRED支持當(dāng)前事務(wù)。
UserController實(shí)現(xiàn)代碼如下,其中save方法開(kāi)啟了事務(wù):
@RestController
publicclassUserController{
@Resource
privateUserServiceuserService;
@Resource
privateLogServicelogService;
@RequestMapping("/save")
@Transactional
publicObjectsave(Useruser){
//插入用戶操作
userService.save(user);
//插入日志
logService.saveLog("用戶插入:"+user.getName());
returntrue;
UserService實(shí)現(xiàn)代碼如下:
@Service
publicclassUserService{
@Resource
privateUserMapperuserMapper;
@Transactional(propagation=Propagation.REQUIRED)
publicintsave(Useruser){
returnuserMapper.save(user);
LogService實(shí)現(xiàn)代碼如下:
@Service
publicclassLogService{
@Resource
privateLogMapperlogMapper;
@Transactional(propagation=Propagation.REQUIRED)
publicintsaveLog(Stringcontent){
//出現(xiàn)異常
inti=10/0;
returnlogMapper.saveLog(content);
執(zhí)行結(jié)果:程序報(bào)錯(cuò),兩張表中都沒(méi)有插入任何數(shù)據(jù)。
執(zhí)行流程描述:
首先UserService中的添加用戶方法正常執(zhí)行完成。LogService保存日志程序報(bào)錯(cuò),因?yàn)槭褂玫氖荱serController中的全局事務(wù),所以整個(gè)事務(wù)回滾,步驟1中的操作也跟著回滾。所以數(shù)據(jù)庫(kù)中沒(méi)有添加任何數(shù)據(jù)。
REQUIRED_NEW使用演示
REQUIRED_NEW不支持當(dāng)前事務(wù)。
UserController實(shí)現(xiàn)代碼:
@RequestMapping("/save")
@Transactional
publicObjectsave(Useruser){
//插入用戶操作
userService.save(user);
//插入日志
logService.saveLog("用戶插入:"+user.getName());
returntrue;
UserService實(shí)現(xiàn)代碼:
@Service
publicclassUserService{
@Resource
privateUserMapperuserMapper;
@Transactional(propagation=Propagation.REQUIRES_NEW)
publicintsave(Useruser){
System.out.println("執(zhí)行save方法.");
returnuserMapper.save(user);
LogService實(shí)現(xiàn)代碼:
@Service
publicclassLogService{
@Resource
privateLogMapperlogMapper;
@Transactional(propagation=Propagation.REQUIRES_NEW)
publicintsaveLog(Stringcontent){
//出現(xiàn)異常
inti=10/0;
returnlogMapper.saveLog(content);
程序執(zhí)行結(jié)果:
User表中成功添加了一條用戶數(shù)據(jù),Log表執(zhí)行失敗,沒(méi)有加入任何數(shù)據(jù),但它并沒(méi)有影響到UserController中的事務(wù)執(zhí)行。
通過(guò)以上結(jié)果可以看出:LogService中使用的是單獨(dú)的事務(wù),雖然LogService中的事務(wù)執(zhí)行失敗了,但并沒(méi)有影響UserController和UserService中的事務(wù)。
NESTED使用演示
NESTED是嵌套事務(wù)。
UserController實(shí)現(xiàn)代碼如下:
@RequestMapping("/save")
@Transactional
publicObjectsave(Useruser){
//插入用戶操作
userService.save(user);
returntrue;
UserService實(shí)現(xiàn)代碼如下:
@Transactional(propagation=Propagation.NESTED)
publicintsave(Useruser){
intresult=userMapper.save(user);
System.out.println("執(zhí)行save方法.");
//插入日志
logService.saveLog("用戶插入:"+user.getName());
returnresult;
LogService實(shí)現(xiàn)代碼如下:
@Transactional(propagation=Propagation.NESTED)
publicintsaveLog(Stringcontent){
//出現(xiàn)異常
inti=10/0;
returnlogMapper.saveLog(content);
最終執(zhí)行結(jié)果,用戶表和日志表都沒(méi)有添加任何數(shù)據(jù)。
執(zhí)行流程描述:
UserController中調(diào)用了UserService的添加用戶方法,UserService使用NESTED循環(huán)嵌套事務(wù),并成功執(zhí)行了添加用戶的方法。UserService中調(diào)用了LogService的添加方法,LogService使用了NESTED循環(huán)嵌套事務(wù),但在方法執(zhí)行中出現(xiàn)的異常,因此回滾了當(dāng)前事務(wù)。因?yàn)閁serService使用的是嵌套事務(wù),所以發(fā)生回滾的事務(wù)是全局的,也就是說(shuō)UserSer
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年英語(yǔ)教師學(xué)期工作總結(jié)模版
- 放學(xué)后班級(jí)管理
- 軟件培訓(xùn)課件制作規(guī)范
- 湖北省恩施州鶴峰縣2025屆七年級(jí)數(shù)學(xué)第二學(xué)期期末檢測(cè)模擬試題含解析
- 2025屆湖北省武漢市新觀察八年級(jí)數(shù)學(xué)第二學(xué)期期末監(jiān)測(cè)模擬試題含解析
- 大學(xué)生職業(yè)規(guī)劃大賽《建筑電氣與智能化專(zhuān)業(yè)》生涯發(fā)展展示
- 大學(xué)生職業(yè)規(guī)劃大賽《新能源材料與器件專(zhuān)業(yè)》生涯發(fā)展展示
- 動(dòng)態(tài)護(hù)理查房
- 小兒常見(jiàn)急癥護(hù)理
- 公司培訓(xùn)系統(tǒng)構(gòu)建與實(shí)施
- 海洋漁業(yè)安全教育培訓(xùn)知識(shí)考試復(fù)習(xí)題庫(kù)-中(多選題匯總)
- 樓體廣告畫(huà)面更換施工方案
- 錯(cuò)漏混料點(diǎn)檢稽核表空白模板
- 面癱疑難病例討論
- 鋼結(jié)構(gòu)施工進(jìn)度計(jì)劃表模版
- 工程項(xiàng)目部組織機(jī)構(gòu)架構(gòu)
- 初三上學(xué)期自我陳述報(bào)告范文800字
- 酈道元《水經(jīng)注·序》原文翻譯注釋與鑒賞
- 2023年中考物理專(zhuān)題復(fù)習(xí):《電磁學(xué)》實(shí)驗(yàn)題
- 腹部CT斷層解剖結(jié)構(gòu)肝胰腺
- 超標(biāo)準(zhǔn)洪水應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論