Spring事務——使用TransactionProxyFactoryBean創(chuàng)建事務代理

Spring同時支持編程式事務策略和聲明式事務策略闹伪,大部分時候凭戴,我們都推薦采用聲明式事務策略函喉。使用聲明式事務策略的優(yōu)勢十分明顯:

聲明式事務能大大降低開發(fā)者的代碼書寫量,而且聲明式事務幾乎不影響應用的代碼麸塞。因此,不論底層事務策略如何變化涧衙,應用程序都無需任何改變

應用程序代碼無需任何事務處理代碼喘垂,可以更專注于業(yè)務邏輯的實現(xiàn)

Spring可對任何POJO的方法提供事務管理,而且Spring的聲明式事務管理無需容器的支持绍撞,可在任何環(huán)境下使用

EJB的CMT無法提供聲明式回滾規(guī)則正勒;而通過配置文件,Spring可指定事務在遇到特定異常時自動回滾傻铣。Spring不僅可在代碼中使用setRollbackOnly回滾事務章贞,也可在配置文件中配置回滾規(guī)則

由于Spring采用AOP的方式管理事務,因此非洲,可以在事務回滾動作中插入用戶自己的動作鸭限,而不僅僅是執(zhí)行系統(tǒng)默認的回滾

? ? 本文主要介紹Spring中聲明式事務管理的使用。

在Spring1.X中两踏,聲明式事務使用TransactionProxyFactoryBean來配置事務代理Bean败京。正如它的類名所暗示的,它是一個專門為目標Bean生成事務代理的工廠Bean梦染。既然TransactionProxyFactoryBean產(chǎn)生的是事務代理Bean赡麦,可見Spring的聲明式事務策略是基于Spring AOP的朴皆。

每個TransactionProxyFactoryBean為一個目標Bean生成一個事務代理Bean,事務代理的方法改寫了目標Bean的方法泛粹,就是在目標Bean的方法執(zhí)行之前加入開始事務遂铡,在目標Bean的方法正常結(jié)束之前提交事務,如果遇到特定異常則回滾晶姊。

TransactionProxyFactoryBean創(chuàng)建事務代理時扒接,需要了解當前事務所處的環(huán)境,該環(huán)境屬性通過PlatformTransactionManager實例(其實現(xiàn)類的實例)傳入们衙,而相關(guān)事務規(guī)則則在該Bean定義中給出钾怔。下面是一個簡單的持久化測試程序,該程序插入兩條數(shù)據(jù)蒙挑,這兩條數(shù)據(jù)完全相同蒂教,將違反唯一鍵約束:


上面的程序中,兩次update語句將會違反主鍵約束——該行代碼將會引發(fā)異常脆荷,如果在沒有事務的環(huán)境下凝垛,前一條代碼會向數(shù)據(jù)庫中插入一條記錄;但如果在增加了事務控制的環(huán)境下蜓谋,則這兩條語句是一個整體梦皮,因為第二條語句插入失敗將導致第一條插入的記錄也被回滾。下面是在Spring配置文件中配置該測試程序桃焕,并使用TransactionProxyFactoryBean為它們配置事務代理:


剑肯。配置事務代理(如上面的newsDaoTransProxy)時需要傳入一個事務管理器,一個目標Bean观堂,并指定該事務代理的事務屬性让网。事務屬性由transactionAttributes屬性指定。上面事務屬性只有一條事務傳播規(guī)則师痕,該規(guī)則制定對于所有方法都使用PROPAGATION_REQUIRED的傳播規(guī)則溃睹。Spring支持的事務傳播規(guī)則如下:

PROPAGATION_MANDATORY:要求調(diào)用該方法的線程必須處于事務環(huán)境中,否則拋出異常

PROPAGATION_NESTED:如果執(zhí)行該方法的線程已處于事務環(huán)境下胰坟,依然啟動新的事務因篇,方法在嵌套的事務里執(zhí)行。如果執(zhí)行方法的線程為處于事務中笔横,也啟動新的事務竞滓,然后執(zhí)行該方法,此時與PROPAGATION_REQUIRED相同

PROPAGATION_NEVER:不允許調(diào)用該方法的線程處于事務環(huán)境下吹缔,如果調(diào)用該方法的線程處于事務環(huán)境下商佑,則拋出異常

PROPAGATION_NOT_SUPPORTED:如果調(diào)用該方法的線程處在事務中,則暫停當前事務厢塘,然后執(zhí)行該方法

PROPAGATION_REQUIRED:要求在事務環(huán)境中執(zhí)行該方法茶没,如果當前執(zhí)行的線程已處于事務中肌幽,則直接調(diào)用;如果當前執(zhí)行線程不處于事務中礁叔,則啟動新的事務后執(zhí)行該方法

PROPAGATION_REQUIRES_NEW:要求在事務環(huán)境中執(zhí)行該方法牍颈,如果當前執(zhí)行的線程已處于事務中迄薄,則暫停當前事務琅关,啟動新事務后執(zhí)行該方法;如果當前執(zhí)行線程不處于事務中讥蔽,則啟動新的事務后執(zhí)行該方法

PROPAGATION_SUPPORTS:如果當前執(zhí)行線程處于事務中涣易,則使用當前事務;不過不在事務中冶伞,則不使用事務

????主程序中主要獲取了定義的NewsDao類型的Bean新症,并調(diào)用其insert方法,下面是主程序


上面的第4行中獲取了newsDaoTransProxy Bean响禽,該Bean已經(jīng)不在是NewsDaoImpl類的實例了徒爹,它只是Spring容器創(chuàng)建的事務代理,該事務代理以NewsDaoImpl實例為目標對象芋类,且該目標對象也實現(xiàn)了NewsDao接口(與NewsDaoImpl實現(xiàn)了相同的接口)隆嗅,故代理對象也可以當成NewsDao實例來使用。運行上面的程序侯繁,將出現(xiàn)一個異常胖喳,而且insert方法所執(zhí)行的兩條SQL語句全部回滾——因為事務控制的緣故。

????當我們使用TransactionProxyFactoryBean為目標Bean配置了事務代理以后贮竟,SpringAOP將會把負責事務操作的增強處理織入目標Bean的業(yè)務方法當中丽焊。事實上,Spring不僅支持對接口的代理咕别,整合CGLIB后技健,Spring甚至可以對具體類生成代理,只要設(shè)置proxyTargetClass屬性為true即可惰拱。如果目標Bean沒有實現(xiàn)任何接口凫乖,proxyTargetClass屬性默認被設(shè)為true,此時Spring會對具體類生成代理弓颈。當然通常建議面向接口編程帽芽,而不要面向具體的實現(xiàn)類編程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翔冀,一起剝皮案震驚了整個濱河市导街,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纤子,老刑警劉巖搬瑰,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件款票,死亡現(xiàn)場離奇詭異,居然都是意外死亡泽论,警方通過查閱死者的電腦和手機艾少,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翼悴,“玉大人缚够,你說我怎么就攤上這事○惺辏” “怎么了谍椅?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長古话。 經(jīng)常有香客問我雏吭,道長,這世上最難降的妖魔是什么陪踩? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任杖们,我火速辦了婚禮,結(jié)果婚禮上肩狂,老公的妹妹穿的比我還像新娘摘完。我一直安慰自己,他們只是感情好婚温,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布描焰。 她就那樣靜靜地躺著,像睡著了一般栅螟。 火紅的嫁衣襯著肌膚如雪荆秦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天力图,我揣著相機與錄音步绸,去河邊找鬼。 笑死吃媒,一個胖子當著我的面吹牛瓤介,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赘那,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼刑桑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了募舟?” 一聲冷哼從身側(cè)響起祠斧,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拱礁,沒想到半個月后琢锋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辕漂,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年吴超,在試婚紗的時候發(fā)現(xiàn)自己被綠了钉嘹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲸阻,死狀恐怖跋涣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赘娄,我是刑警寧澤仆潮,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布宏蛉,位于F島的核電站遣臼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拾并。R本人自食惡果不足惜揍堰,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗅义。 院中可真熱鬧屏歹,春花似錦、人聲如沸之碗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褪那。三九已至幽纷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間博敬,已是汗流浹背友浸。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偏窝,地道東北人收恢。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像祭往,于是被迫代替她去往敵國和親伦意。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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