Spring事務(wù)管理

隔離級別是指多個(gè)并發(fā)的事務(wù)之間的隔離程度余舶。

  1. TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個(gè)事務(wù)可以讀取另一個(gè)事務(wù)修改但還沒有提交的數(shù)據(jù)(臟數(shù)據(jù))磅轻。該級別不能防止臟讀和不可重復(fù)讀,因此很少使用該隔離級別炭臭。
  2. TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個(gè)事務(wù)只能讀取另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)嫂粟。該級別可以防止臟讀读虏。oracle默認(rèn)隔離級別责静。
  3. TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個(gè)事務(wù)在整個(gè)過程中可以多次重復(fù)執(zhí)行某個(gè)查詢,并且每次返回的記錄都相同盖桥。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢灾螃,這些新增的記錄也會被忽略。該級別可以防止臟讀和不可重復(fù)讀揩徊。
  4. TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個(gè)執(zhí)行腰鬼,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說塑荒,該級別可以防止臟讀熄赡、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能齿税。通常情況下也不會用到該級別彼硫。

事務(wù)傳播行為是指,如果在開始當(dāng)前事務(wù)之前凌箕,一個(gè)事務(wù)上下文已經(jīng)存在拧篮,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為。在TransactionDefinition定義中包括了如下幾個(gè)表示傳播行為的常量:

  1. TransactionDefinition.PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù)牵舱,則加入該事務(wù)串绩;如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)芜壁。(默認(rèn)參數(shù))
  2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個(gè)新的事務(wù)礁凡,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起慧妄。
  3. TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù)顷牌,則加入該事務(wù);如果當(dāng)前沒有事務(wù)塞淹,則以非事務(wù)的方式繼續(xù)運(yùn)行韧掩。
  4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù)窖铡,則把當(dāng)前事務(wù)掛起疗锐。
  5. TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù)费彼,則拋出異常滑臊。
  6. TransactionDefinition.PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù)箍铲;如果當(dāng)前沒有事務(wù)雇卷,則拋出異常。
  7. TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù)颠猴,則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行关划;如果當(dāng)前沒有事務(wù),則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED翘瓮。

事務(wù)超時(shí)贮折,就是指一個(gè)事務(wù)所允許執(zhí)行的最長時(shí)間,如果超過該時(shí)間限制但事務(wù)還沒有完成资盅,則自動(dòng)回滾事務(wù)调榄。在 TransactionDefinition 中以 int 的值來表示超時(shí)時(shí)間,其單位是秒呵扛。

事務(wù)的只讀屬性是指每庆,對事務(wù)性資源進(jìn)行只讀操作或者是讀寫操作。所謂事務(wù)性資源就是指那些被事務(wù)管理的資源今穿,比如數(shù)據(jù)源缤灵、 JMS 資源,以及自定義的事務(wù)性資源等等蓝晒。如果確定只對事務(wù)性資源進(jìn)行只讀操作腮出,那么我們可以將事務(wù)標(biāo)志為只讀的,以提高事務(wù)處理的性能拔创。在 TransactionDefinition 中以 boolean 類型來表示該事務(wù)是否只讀利诺。

通常情況下,如果在事務(wù)中拋出了未檢查異常(繼承自 RuntimeException 的異常)剩燥,則默認(rèn)將回滾事務(wù)慢逾。如果沒有拋出任何異常,或者拋出了已檢查異常灭红,則仍然提交事務(wù)侣滩。這通常也是大多數(shù)開發(fā)者希望的處理方式,也是 EJB 中的默認(rèn)處理方式变擒。但是君珠,我們可以根據(jù)需要人為控制事務(wù)在拋出某些未檢查異常時(shí)任然提交事務(wù),或者在拋出某些已檢查異常時(shí)回滾事務(wù)娇斑。

事務(wù)編程分為兩種:1)編程式事務(wù)管理策添;2)聲明式事務(wù)管理材部。

編程式事務(wù)管理會產(chǎn)生大量樣板代碼,但是能理解底層唯竹。

Spring 的聲明式事務(wù)管理在底層是建立在 AOP 的基礎(chǔ)之上的乐导。其本質(zhì)是對方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個(gè)事務(wù)浸颓,在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)物臂。

聲明式事務(wù)最大的優(yōu)點(diǎn)就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼产上,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過等價(jià)的基于標(biāo)注的方式)棵磷,便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。因?yàn)槭聞?wù)管理本身就是一個(gè)典型的橫切邏輯晋涣,正是 AOP 的用武之地仪媒。

聲明式事務(wù)不僅簡單,也使得純業(yè)務(wù)代碼不被污染姻僧,極大方便后期的代碼維護(hù)规丽。

和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是撇贺,后者的最細(xì)粒度只能作用到方法級別赌莺,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。但是即便有這樣的需求松嘶,也存在很多變通的方法艘狭,比如,可以將需要行事務(wù)管理的代碼塊獨(dú)立為方法等等翠订。

雖然 @Transactional 注解可以作用于接口巢音、接口方法、類以及類方法上尽超,但是 Spring 小組建議不要在接口或者接口方法上使用該注解官撼,因?yàn)檫@只有在使用基于接口的代理時(shí)它才會生效。另外似谁, @Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上傲绣,這是由 Spring AOP 的本質(zhì)決定的。如果你在 protected巩踏、private 或者默認(rèn)可見性的方法上使用 @Transactional 注解秃诵,這將被忽略,也不會拋出任何異常塞琼。

套路:找到目標(biāo)類的Advice

@Transactional 的Advice 是TransactionInterceptor

如果希望在通過this對象調(diào)用的方法上應(yīng)用通知菠净,那么你必須使用currentProxy對象,并調(diào)用其上的相應(yīng)方法。當(dāng)Bean中一個(gè)方法去調(diào)用這個(gè)類中帶有@Transactional 時(shí)毅往,事務(wù)會失效牵咙。正確方式使用AopContext.currentProxy()得到當(dāng)前代理類,然后再調(diào)用事務(wù)方法攀唯。

參考資料:全面分析 Spring 的編程式事務(wù)管理及聲明式事務(wù)管理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霜大,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子革答,更是在濱河造成了極大的恐慌,老刑警劉巖曙强,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件残拐,死亡現(xiàn)場離奇詭異,居然都是意外死亡碟嘴,警方通過查閱死者的電腦和手機(jī)溪食,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娜扇,“玉大人错沃,你說我怎么就攤上這事∪钙埃” “怎么了枢析?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刃麸。 經(jīng)常有香客問我醒叁,道長,這世上最難降的妖魔是什么泊业? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任把沼,我火速辦了婚禮,結(jié)果婚禮上吁伺,老公的妹妹穿的比我還像新娘饮睬。我一直安慰自己,他們只是感情好篮奄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布捆愁。 她就那樣靜靜地躺著,像睡著了一般宦搬。 火紅的嫁衣襯著肌膚如雪牙瓢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天间校,我揣著相機(jī)與錄音矾克,去河邊找鬼。 笑死憔足,一個(gè)胖子當(dāng)著我的面吹牛胁附,可吹牛的內(nèi)容都是我干的酒繁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼控妻,長吁一口氣:“原來是場噩夢啊……” “哼州袒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弓候,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤郎哭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后菇存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夸研,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年依鸥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亥至。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贱迟,死狀恐怖姐扮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衣吠,我是刑警寧澤茶敏,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蒸播,受9級特大地震影響睡榆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袍榆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一胀屿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧包雀,春花似錦宿崭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赞草,卻和暖如春讹堤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厨疙。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工洲守, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓梗醇,卻偏偏與公主長得像知允,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子叙谨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容