7)Spring事務(wù)管理詳解 實(shí)戰(zhàn)筆記

概要:2Spring事務(wù)管理接口(隔離級(jí)別炊汹,傳播行為)篡撵、3接口介紹、4回滾原理

Spring事務(wù)的本質(zhì)其實(shí)就是數(shù)據(jù)庫對(duì)事務(wù)的支持坷澡,沒有數(shù)據(jù)庫的事務(wù)支持拼余,spring是無法提供事務(wù)功能的口予。對(duì)于純JDBC操作數(shù)據(jù)庫昔脯,想要用到事務(wù)居凶,可以按照以下步驟進(jìn)行:

1)獲取連接 Connection con = DriverManager.getConnection()

2)開啟事務(wù)con.setAutoCommit(true/false);

3)執(zhí)行CRUD????????4)提交事務(wù)/回滾事務(wù) con.commit() / con.rollback();? ? 5)關(guān)閉連接 conn.close();

1.事物的特性(ACID)

原子性坝撑、一致性累舷、隔離性傲霸、持久性

2.Spring事務(wù)管理接口:

PlatformTransactionManager:?(平臺(tái))事務(wù)管理器

TransactionDefinition:?事務(wù)定義信息(事務(wù)隔離級(jí)別宿刮、傳播行為岂嗓、超時(shí)汁展、只讀、回滾規(guī)則)

TransactionStatus:?事務(wù)運(yùn)行狀態(tài)

2.1PlatformTransactionManager:

Spring不直接管理厌殉,提供多種事務(wù)管理器食绿,委托給Hibernate或JTA等持久化機(jī)制,提供相關(guān)平臺(tái)框架事務(wù)實(shí)現(xiàn)公罕。 通過org.springframework.transaction.PlatformTransactionManager?接口器紧,為各個(gè)平臺(tái)如JDBC、Hibernate等提供事務(wù)管理器楼眷,實(shí)現(xiàn)就是各平臺(tái)的事

PlatformTransactionManager接口定義了三個(gè)方法:

getTransaction :根據(jù)指定的傳播行為铲汪,返回當(dāng)前活動(dòng)的事務(wù)或創(chuàng)建一個(gè)新事務(wù)

不同持久層框架所對(duì)應(yīng)的接口實(shí)現(xiàn)類:

用JDBC或者iBatis(Mybatis)持久化時(shí),xml配置:

2.2 TransactionDefinition接口:


2.21并發(fā)事務(wù)帶來的問題:(事務(wù)隔離級(jí)別)

臟讀(Dirty read):事務(wù)修改,沒提交到庫罐柳,另一個(gè)事務(wù)訪問掌腰,用這數(shù)據(jù)(臟數(shù)據(jù):可能不正確)

丟失修改(Lost to modify):事務(wù)讀時(shí),另一也訪該數(shù)據(jù)张吉,第一個(gè)事務(wù)改齿梁,第二個(gè)事務(wù)也改。第一個(gè)事務(wù)丟失

不可重復(fù)讀(Unrepeatableread):事務(wù)內(nèi)多次讀同一數(shù)據(jù)肮蛹。事務(wù)沒結(jié)束勺择,另一事務(wù)也訪問該數(shù)據(jù)。第一事務(wù)中兩次讀數(shù)據(jù)之間伦忠,第二改事務(wù)省核,導(dǎo)致不一樣。?修改時(shí)

幻讀(Phantom read):與不可重復(fù)讀類似昆码。事務(wù)T1讀幾行數(shù)據(jù)气忠,事務(wù)T2插入邓深。隨后查,T1發(fā)現(xiàn)多了不存在的記錄笔刹,新增或刪除時(shí)

2.22隔離級(jí)別

TransactionDefinition.ISOLATION_DEFAULT:默認(rèn)隔離級(jí)別(用db默認(rèn)的隔離級(jí)別)芥备,Mysql 默認(rèn)REPEATABLE_READ隔離級(jí)別 ,Oracle 默認(rèn) READ_COMMITTED

1)TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低的隔離級(jí)別舌菜,允許讀取尚未提交的數(shù)據(jù)變更萌壳,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀

2)TransactionDefinition.ISOLATION_READ_COMMITTED:允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù)日月,阻止臟讀袱瓮,但幻讀或不可重復(fù)讀仍有可能

3)TransactionDefinition.ISOLATION_REPEATABLE_READ:對(duì)同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改爱咬,可以阻止臟讀和不可重復(fù)讀尺借,但幻讀仍有可能發(fā)生。

4)TransactionDefinition.ISOLATION_SERIALIZABLE:最高隔離級(jí)別精拟,防止臟讀燎斩、不可重復(fù)讀以及幻讀

2.23事務(wù)傳播行為(解決方法間調(diào)用事務(wù)問題)

事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí)蜂绎,必須如何傳播栅表。如:方法可能繼續(xù)現(xiàn)有事務(wù)中運(yùn)行,也可開啟新事務(wù)师枣,并在自的事務(wù)中運(yùn)行怪瓶。TransactionDefinition定義中傳播行為常量:

1)TransactionDefinition.PROPAGATION_REQUIRED:如當(dāng)前存在事務(wù),則加入該事務(wù)践美;沒有創(chuàng)建新事務(wù)洗贰。

2)TransactionDefinition.PROPAGATION_SUPPORTS:如當(dāng)前存在事務(wù),則加入該事務(wù)陨倡;沒有敛滋,以非事務(wù)方式繼續(xù)運(yùn)行

3)TransactionDefinition.PROPAGATION_MANDATORY:如當(dāng)前存在事務(wù),則加入該事務(wù)玫膀;沒有則拋異常

? ??不支持當(dāng)前事務(wù)的情況:

TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務(wù)矛缨,當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:非事務(wù)方式運(yùn)行帖旨,當(dāng)前存在事務(wù)箕昭,把當(dāng)前事務(wù)掛起

TransactionDefinition.PROPAGATION_NEVER:非事務(wù)方式運(yùn)行,當(dāng)前存在事務(wù)解阅,拋異常

? ??其他情況:

TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù)落竹,則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;如果當(dāng)前沒有事務(wù)货抄,則該取值等價(jià)于TransactionDefinition.PROPAGATION_REQUIRED述召。

這里需要指出的是朱转,前面的六種事務(wù)傳播行為是 Spring 從 EJB 中引入的,他們共享相同的概念积暖。而PROPAGATION_NESTED是 Spring 所特有的藤为。以 PROPAGATION_NESTED 啟動(dòng)的事務(wù)內(nèi)嵌于外部事務(wù)中(如果存在外部事務(wù)的話),此時(shí)夺刑,內(nèi)嵌事務(wù)并不是一個(gè)獨(dú)立的事務(wù)缅疟,它依賴于外部事務(wù)的存在,只有通過外部的事務(wù)提交遍愿,才能引起內(nèi)部事務(wù)的提交存淫,嵌套的子事務(wù)不能單獨(dú)提交。如果熟悉 JDBC 中的保存點(diǎn)(SavePoint)的概念沼填,那嵌套事務(wù)就很容易理解了桅咆,其實(shí)嵌套的子事務(wù)就是保存點(diǎn)的一個(gè)應(yīng)用,一個(gè)事務(wù)中可以包括多個(gè)保存點(diǎn)坞笙,每一個(gè)嵌套子事務(wù)岩饼。另外,外部事務(wù)的回滾也會(huì)導(dǎo)致嵌套子事務(wù)的回滾羞海。

2.24事務(wù)超時(shí)屬性(一個(gè)事務(wù)允許執(zhí)行的最長(zhǎng)時(shí)間)

超時(shí)沒完成忌愚,自動(dòng)回滾。int表示時(shí)間却邓,單位是秒

2.25事務(wù)只讀屬性(對(duì)事物資源是否執(zhí)行只讀操作)

以提高事務(wù)處理性能。在 TransactionDefinition 中以 boolean 表示

2.26回滾規(guī)則(定義事務(wù)回滾規(guī)則)

定義哪些異常會(huì)回滾院水、哪些不會(huì)腊徙。默認(rèn),運(yùn)行期異常時(shí)會(huì)回滾檬某,檢查型異常不回滾(與EJB回滾行為一致)

但可聲明事務(wù)特定檢查型異常時(shí)撬腾,像運(yùn)行異常那樣回滾。還可聲明運(yùn)行異常不回滾

3.TransactionStatus接口介紹

記錄事務(wù)狀態(tài) 定義了一組方法,用來獲取或判斷事務(wù)相應(yīng)狀態(tài)信息

PlatformTransactionManager.getTransaction(…) 方法返回TransactionStatus 對(duì)象恢恼。

返回TransactionStatus 對(duì)象可能代表新的或已經(jīng)存在事務(wù)(如當(dāng)前調(diào)用堆棧有符合條件事務(wù))民傻。

4、Spring事務(wù)回滾底層實(shí)現(xiàn)

用TransactionInterceptor方法攔截器實(shí)現(xiàn)事務(wù)經(jīng)過以下步驟實(shí)現(xiàn)回滾

1)獲取事務(wù)屬性(注解@Transactional的屬性)

2)獲取事務(wù)管理器PlatformTransactionManager

3)獲取需要事務(wù)的方法名和事務(wù)信息

4)創(chuàng)建事務(wù)场斑、獲取事務(wù)

4)目標(biāo)方法執(zhí)行

5)事務(wù)回滾(如果是嵌套回滾則回滾到保存點(diǎn))

參考:https://zhuanlan.zhihu.com/p/149409015

另加2:

a方法內(nèi)調(diào)b方法漓踢,然后a方法拋出異常導(dǎo)致事務(wù)回滾,如何讓b方法執(zhí)行結(jié)果不回滾漏隐?

B方法事務(wù)級(jí)別require new喧半,不要寫在同一個(gè)類aop切不到,想同一個(gè)類調(diào)用青责,自己去applicationcontex 拿bean

https://my.oschina.net/xiaolyuh/blog/3109049

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挺据,一起剝皮案震驚了整個(gè)濱河市取具,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扁耐,老刑警劉巖暇检,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婉称,居然都是意外死亡占哟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門酿矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榨乎,“玉大人,你說我怎么就攤上這事瘫筐∶凼睿” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵策肝,是天一觀的道長(zhǎng)肛捍。 經(jīng)常有香客問我,道長(zhǎng)之众,這世上最難降的妖魔是什么拙毫? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮棺禾,結(jié)果婚禮上缀蹄,老公的妹妹穿的比我還像新娘。我一直安慰自己膘婶,他們只是感情好缺前,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悬襟,像睡著了一般衅码。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脊岳,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天逝段,我揣著相機(jī)與錄音,去河邊找鬼割捅。 笑死奶躯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棺牧。 我是一名探鬼主播巫糙,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼颊乘!你這毒婦竟也來了参淹?” 一聲冷哼從身側(cè)響起醉锄,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浙值,沒想到半個(gè)月后恳不,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡开呐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烟勋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筐付。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卵惦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓦戚,到底是詐尸還是另有隱情沮尿,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布较解,位于F島的核電站畜疾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏印衔。R本人自食惡果不足惜啡捶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奸焙。 院中可真熱鬧瞎暑,春花似錦、人聲如沸忿偷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲤桥。三九已至,卻和暖如春渠概,著一層夾襖步出監(jiān)牢的瞬間茶凳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工播揪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贮喧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓猪狈,卻偏偏與公主長(zhǎng)得像箱沦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雇庙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • Spring 事務(wù)屬性分析 事務(wù)管理對(duì)于企業(yè)應(yīng)用而言至關(guān)重要谓形。它保證了用戶的每一次操作都是可靠的灶伊,即便出現(xiàn)了異常的...
    壹點(diǎn)零閱讀 1,305評(píng)論 0 2
  • 很多人喜歡這篇文章,特此同步過來 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識(shí)》系列中寒跳,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,739評(píng)論 2 59
  • 目前JavaWeb系統(tǒng)的框架容器基本都是使用Spring管理的聘萨,其中事務(wù)管理也是比較重要的,之前也是看過童太,網(wǎng)上介紹...
    wiliam_wiliam閱讀 543評(píng)論 0 0
  • 事務(wù): 事務(wù)是邏輯上的一組操作米辐,要么都執(zhí)行,要么都不執(zhí)行书释。 事物的特性:(ACID) 原子性: 事務(wù)是最小的執(zhí)行單...
    n油炸小朋友閱讀 432評(píng)論 1 1
  • 2018年5月5日 5月5日天璣金服“融到錢翘贮,管住錢”大咖分享活動(dòng),邀請(qǐng)了撒椒&探魚品牌管理總公司的財(cái)務(wù)負(fù)責(zé)人楊冰...
    Ninahuang閱讀 344評(píng)論 2 1