SpringBoot聲明式事務(wù)的簡(jiǎn)單運(yùn)用說(shuō)明
關(guān)于事物的基本概念等這里就不介紹了。
Spring聲明式事物的實(shí)現(xiàn),有兩種方式;第一種是配置xml,第二種是使用相關(guān)注解(這兩種方式可詳見(jiàn)《程序員成長(zhǎng)筆記(一)》的相關(guān)章節(jié))。SpringBoot中默認(rèn)配置了第二種方式,所以,SpringBoot直接使用注解即可。下面介紹SpringBoot通過(guò)注解開(kāi)啟事物的使用。
SpringBoot使用事物的步驟:
第一步:在啟動(dòng)類上開(kāi)啟事物支持
提示:
@EnableTransactionManagement注解其實(shí)在大多數(shù)情況下,不是必須的,因?yàn)镾pringBoot在
TransactionAutoConfiguration類里為我們自動(dòng)配置啟用了@EnableTransactionManagement注解。
不過(guò)自動(dòng)啟用該注解有兩個(gè)前提條件,分別是:@ConditionalOnBean(PlatformTransactionManager.class)和@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class),而一般情況下,這兩個(gè)條件都是滿足的,所以一般的,我們?cè)趩?dòng)類上寫不寫@EnableTransactionManagement都行。本人這里還是建議寫出來(lái)。
第二步:在業(yè)務(wù)邏輯層接口的實(shí)現(xiàn)類中的相關(guān)方法上聲明事物
給出Transactional 注解的常用屬性表:
屬性
說(shuō)明
propagation
事務(wù)的傳播行為,默認(rèn)值為 REQUIRED。
isolation
事務(wù)的隔離度,默認(rèn)值采用 DEFAULT
timeout
事務(wù)的超時(shí)時(shí)間,默認(rèn)值為-1,不超時(shí)。
如果設(shè)置了超時(shí)時(shí)間(單位秒),那么如果超過(guò)該時(shí)間限制了但事務(wù)還沒(méi)有完成,則自動(dòng)回滾事務(wù)。
read-only
指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true。
rollbackFor
用于指定能夠觸發(fā)事務(wù)回滾的異常類型,如果有多個(gè)異常類型需要指定,各類型之間可以通過(guò)逗號(hào)分隔。{xxx1.class, xxx2.class,……}
noRollbackFor
拋出 no-rollback-for 指定的異常類型,不回滾事務(wù)。{xxx1.class, xxx2.class,……}
……
注意事項(xiàng):
service實(shí)現(xiàn)類(一般不建議在接口上)上添加@Transactional,可以將整個(gè)類納入spring事務(wù)管理,在每個(gè)業(yè)務(wù)方法執(zhí)行時(shí)都會(huì)開(kāi)啟一個(gè)事務(wù),不過(guò)這些事務(wù)采用相同的管理方式。
Transactional 注解只能應(yīng)用到 public 可見(jiàn)度的方法上。 如果應(yīng)用在protected、private或者 package可見(jiàn)度的方法上,也不會(huì)報(bào)錯(cuò),不過(guò)事務(wù)設(shè)置不會(huì)起作用。
默認(rèn)情況下,Transactional 注解的事物所管理的方法中,如果方法拋出運(yùn)行時(shí)異常或error,那么會(huì)進(jìn)行事務(wù)回滾;如果方法拋出的是非運(yùn)行時(shí)異常,那么不會(huì)回滾。
注:SQL異常屬于檢查異常(有的框架將SQL異常重寫為了運(yùn)行時(shí)異常),但是有時(shí)我們寫SQL時(shí),檢查異常并不會(huì)提示;而默認(rèn)情況下,事物對(duì)檢查異常不會(huì)作出回滾處理。
注:在很多時(shí)候,我們除了catch一般的異常或自定義異常外,我們還習(xí)慣于catch住Exception異常;然后再拋出Exception異常。但是Exception異常屬于非運(yùn)行時(shí)異常(即:檢查異常),因?yàn)槟J(rèn)是運(yùn)行時(shí)異常時(shí)事物才進(jìn)行回滾,那么這種情況下,是不會(huì)回滾的。我們可以在@Transacional注解中,通過(guò)rollbackFor = {Exception.class} 來(lái)解決這個(gè)問(wèn)題。即:設(shè)置當(dāng)Exception異常或Exception的所有任意子類異常時(shí)事物會(huì)進(jìn)行回滾。
注:被catch處理了的異常,不會(huì)被事物作為判斷依據(jù);如果異常被catch 了,但是又在catch中拋出了新的異常,那么事物會(huì)以這個(gè)新的異常作 為是否進(jìn)行回滾的判斷依據(jù)。
事務(wù)的傳播機(jī)制(行為):
事務(wù)的傳播行為是指,如果在開(kāi)始當(dāng)前事務(wù)之前,一個(gè)事務(wù)上下文已經(jīng)存在,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為。
即:在執(zhí)行一個(gè)@Transactinal注解標(biāo)注的方法時(shí),開(kāi)啟了事務(wù);當(dāng)該方法還在執(zhí)行中時(shí),另一個(gè)人也觸發(fā)了該方法;那么此時(shí)怎么算事務(wù)呢,這時(shí)就可以通過(guò)事務(wù)的傳播機(jī)制來(lái)指定處理方式。
在TransactionDefinition定義中包括了如下幾個(gè)表示傳播行為的常量:
常量
含義
TransactionDefinition.PROPAGATION_REQUIRED
如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。這是默認(rèn)值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW
創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
TransactionDefinition.PROPAGATION_SUPPORTS
如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
TransactionDefinition.PROPAGATION_NEVER
以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY
如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則拋出異常。
TransactionDefinition.PROPAGATION_NESTED
如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來(lái)運(yùn)行;如果當(dāng)前沒(méi)有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED。
事務(wù)補(bǔ)充:
同一個(gè)事務(wù)里面,對(duì)某一條數(shù)據(jù)的增刪改、 都會(huì)影響到這個(gè)事務(wù)里面接下來(lái)的對(duì)這個(gè)條數(shù)的增刪改查,如(舉例部分情況):
阿里piapia規(guī)范推薦:
事務(wù)場(chǎng)景中,拋出異常被catch后,如果需要回滾,一定要手動(dòng)回滾事務(wù)。
如:使用
代替:
阿里推薦的方式屬于自動(dòng)提交/手動(dòng)回滾,那如果我們想要手動(dòng)提交、手動(dòng)回滾的話,可參考:
注:不需要@Transactional注解。
以上這篇SpringBoot聲明式事務(wù)的簡(jiǎn)單運(yùn)用說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向2. IntelliJ IDEA刪除類的方法步驟3. idea導(dǎo)入maven項(xiàng)目的方法4. docker /var/lib/docker/aufs/mnt 目錄清理方法5. layui的checbox在Ajax局部刷新下的設(shè)置方法6. ajax post下載flask文件流以及中文文件名問(wèn)題7. ajax實(shí)現(xiàn)頁(yè)面的局部加載8. XML入門的常見(jiàn)問(wèn)題(四)9. jsp網(wǎng)頁(yè)實(shí)現(xiàn)貪吃蛇小游戲10. IntelliJ IDEA安裝插件的方法步驟
