spring-tx 筆記

spring transaction 筆記

事務(wù)的特性(ACID)

原子性(Atomicity)鄙陡、一致性(Consistency)渊涝、隔離性(Isolation囤锉,又稱獨立性)丈莺、持久性(Durability)。
原子性:一整個交易中的所有操作拐迁,要么全部完成蹭劈,要么全部不完成,不可能停滯在中間某個環(huán)節(jié)线召。交易在執(zhí)行過程中發(fā)生錯誤铺韧,會被回復(fù)(Rollback)到交易開始前的狀態(tài),就像這個交易從來沒有執(zhí)行過一樣缓淹。
一致性:在交易開始之前和交易結(jié)束以后祟蚀,數(shù)據(jù)庫的完整性限制沒有被破壞。
隔離性:兩個交易的執(zhí)行是互不干擾的割卖,一個交易不可能看到其他交易運行時前酿,中間某一時刻的數(shù)據(jù)。
持久性:在交易完成以后鹏溯,該交易對數(shù)據(jù)庫所作的更改便持久地保存在數(shù)據(jù)庫之中罢维,并不會被回復(fù)。

spring的事務(wù)API

PlatformTransactionManager

PlatformTransactionManager(平臺事務(wù)管理器),用于事務(wù)管理的一組API

image.png

spring提供的幾組實現(xiàn)

  1. DataSourceTransactionManager:適用于使用JDBC和iBatis進行數(shù)據(jù)持久化操作的情況肺孵。
  2. HibernateTransactionManager:適用于使用Hibernate進行數(shù)據(jù)持久化操作的情況匀借。
  3. JpaTransactionManager:適用于使用JPA進行數(shù)據(jù)持久化操作的情況。

TransactionDefinition

TransactionDefinition(事務(wù)定義)平窘,定義了事務(wù)的一些基礎(chǔ)信息吓肋,如超時時間、隔離級別瑰艘、傳播屬性等是鬼。事務(wù)的定義包含:事務(wù)的隔離級別、事務(wù)的傳播行為紫新、超時時間設(shè)置均蜜、是否只讀。

事務(wù)隔離級別

TransactionDefinition.ISOLATION_DEFAULT:這是默認值芒率,表示使用底層數(shù)據(jù)庫的默認隔離級別囤耳。對大部分數(shù)據(jù)庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED偶芍。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務(wù)可以讀取另一個事務(wù)修改但還沒有提交的數(shù)據(jù)充择。該級別不能防止臟讀和不可重復(fù)讀,因此很少使用該隔離級別匪蟀。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務(wù)只能讀取另一個事務(wù)已經(jīng)提交的數(shù)據(jù)椎麦。該級別可以防止臟讀,這也是大多數(shù)情況下的推薦值萄窜。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務(wù)在整個過程中可以多次重復(fù)執(zhí)行某個查詢铃剔,并且每次返回的記錄都相同撒桨。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢查刻,這些新增的記錄也會被忽略。該級別可以防止臟讀和不可重復(fù)讀凤类。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個執(zhí)行穗泵,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說谜疤,該級別可以防止臟讀佃延、不可重復(fù)讀以及幻讀。但是這將嚴重影響程序的性能夷磕。通常情況下也不會用到該級別履肃。

事務(wù)傳播行為

TransactionDefinition.PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù)坐桩;如果當(dāng)前沒有事務(wù)尺棋,則創(chuàng)建一個新的事務(wù)。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個新的事務(wù)绵跷,如果當(dāng)前存在事務(wù)膘螟,則把當(dāng)前事務(wù)掛起成福。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù)荆残;如果當(dāng)前沒有事務(wù)奴艾,則以非事務(wù)的方式繼續(xù)運行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運行内斯,如果當(dāng)前存在事務(wù)蕴潦,則把當(dāng)前事務(wù)掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運行嘿期,如果當(dāng)前存在事務(wù)品擎,則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù)备徐,則加入該事務(wù)萄传;如果當(dāng)前沒有事務(wù),則拋出異常蜜猾。
TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù)秀菱,則創(chuàng)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運行;如果當(dāng)前沒有事務(wù)蹭睡,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED衍菱。

TransactionStatus

PlatformTransactionManager.getTransaction(…) 方法返回一個 TransactionStatus 對象。返回的TransactionStatus 對象可能代表一個新的或已經(jīng)存在的事務(wù)(如果在當(dāng)前調(diào)用堆棧有一個符合條件的事務(wù))肩豁。TransactionStatus 接口提供了一個簡單的控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的方法脊串。該接口定義如清單3所示:

TransactionStatus 接口中定義的主要方法

public interface TransactionStatus{ boolean isNewTransaction(); void setRollbackOnly(); boolean isRollbackOnly();}

事務(wù)的使用方式

image.png

環(huán)境搭建

裝配DataSource

根據(jù)實際使用的事務(wù)使用策略裝配事務(wù)管理器,mybatis清钥、jdbc使用DataSourceTransaction琼锋,Hibernate使用HibernateTransaction

編程式事務(wù)管理

裝配TranstactionTemplate,注入事務(wù)管理器祟昭,注入傳播行為和隔離級別

在需要實現(xiàn)事務(wù)的類里面注入TranstactionTemplate缕坎,調(diào)用其execute方法

聲明式事務(wù)管理

利用aop實現(xiàn)的事務(wù)管理,有三種方式

TransactionProxyFactoryBean(不要用篡悟,繁瑣)

  1. 裝配TransactionProxyFactoryBean(這個類實現(xiàn)了FactoryBean谜叹,調(diào)用這個bean得到的不是這個類的實例,而是FactoryBean的getObject())搬葬,注入目標對象荷腊,注入事務(wù)管理器,注入transactionAttribute(這個屬性是Properties急凰,key為需要事務(wù)的方法女仰,value為傳播行為,隔離級別,只讀)

XML的基于AspectJ聲明事務(wù)

  1. 使用<tx:advice></tx:advice>聲明事務(wù)管理通知董栽,注入事務(wù)管理器码倦、事務(wù)屬性(傳播行為、隔離級別等)
  2. 使用aop將通知織入到切入點

注解的基于AspectJ聲明事務(wù)

<tx:annotation-driven transaction-manager="transactionManger"/>
在需要事務(wù)的地方添加@Transaction注解并注入事務(wù)屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锭碳,一起剝皮案震驚了整個濱河市袁稽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擒抛,老刑警劉巖推汽,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異歧沪,居然都是意外死亡歹撒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門诊胞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暖夭,“玉大人,你說我怎么就攤上這事撵孤÷踝牛” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵邪码,是天一觀的道長裕菠。 經(jīng)常有香客問我,道長闭专,這世上最難降的妖魔是什么奴潘? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮影钉,結(jié)果婚禮上画髓,老公的妹妹穿的比我還像新娘。我一直安慰自己斧拍,他們只是感情好雀扶,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布杖小。 她就那樣靜靜地躺著肆汹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪予权。 梳的紋絲不亂的頭發(fā)上昂勉,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音扫腺,去河邊找鬼岗照。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攒至。 我是一名探鬼主播厚者,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迫吐!你這毒婦竟也來了库菲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤志膀,失蹤者是張志新(化名)和其女友劉穎熙宇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉浙,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡烫止,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戳稽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馆蠕。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惊奇,靈堂內(nèi)的尸體忽然破棺而出荆几,到底是詐尸還是另有隱情,我是刑警寧澤赊时,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布吨铸,位于F島的核電站,受9級特大地震影響祖秒,放射性物質(zhì)發(fā)生泄漏诞吱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一竭缝、第九天 我趴在偏房一處隱蔽的房頂上張望房维。 院中可真熱鬧,春花似錦抬纸、人聲如沸咙俩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阿趁。三九已至,卻和暖如春坛猪,著一層夾襖步出監(jiān)牢的瞬間脖阵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工墅茉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留命黔,地道東北人呜呐。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像悍募,于是被迫代替她去往敵國和親蘑辑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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

  • 很多人喜歡這篇文章坠宴,特此同步過來 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實也要歸納到《常識》系列中以躯,但這重點又...
    碼農(nóng)戲碼閱讀 4,743評論 2 59
  • 概念 輕量級的(面向切面AOP)、(IOC控制反轉(zhuǎn))容器框架啄踊。 Spring優(yōu)點 1.降低組件之間的耦合性 2.專...
    愛動腦的程序員閱讀 503評論 1 4
  • spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式忧设。 編程式事務(wù)管理使用TransactionTemplate...
    熊熊要更努力閱讀 250評論 0 0
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,473評論 1 133
  • Spring 復(fù)習(xí) [toc] spring介紹 三層架構(gòu)中spring位置颠通,連接三層址晕。 spring一站式框架正...
    inke閱讀 761評論 0 11