Spring中事務(wù)管理TransactionTemplate和@Transactional注解

1. Spring支持編程式事務(wù)管理TransactionTemplate和聲明式事務(wù)管理@Transactional兩種方式

和編程式事務(wù)相比堆生,聲明式事務(wù)唯一不足地方是最細(xì)粒度只能作用到方法級別朴皆,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別季蚂。但是即便有這樣的需求啊掏,也存在很多變通的方法,比如臼膏,可以將需要進(jìn)行事務(wù)管理的代碼塊獨(dú)立為方法等等(比如使用AopContext.currentProxy())危尿。

2. @Transactional可通過AopContext.currentProxy()解決在同一個類中,非事務(wù)方法A調(diào)用事務(wù)方法B,事務(wù)失效

B方法被A調(diào)用错沽,對B方法的切入失效簿晓,但加上 AopContext.currentProxy() 創(chuàng)建了代理類,在代理類中調(diào)用該方法前后進(jìn)行切入千埃。對于B方法 proxy.B憔儿,執(zhí)行的過程是先記錄日志后調(diào)用方法體,但在A方法 proxyA中調(diào)用只能對A進(jìn)行增強(qiáng)放可,A里面調(diào)用B使用的是對象.B(),而不是 $proxy.B(),所以對B的切入無效谒臼。

注:AopContext.currentProxy()使用了ThreadLocal保存了代理對象,因此
AopContext.currentProxy().B()就能解決耀里。

public class Demo {

    public void methodA () {
        ...
        // 獲取當(dāng)前代理類蜈缤,保證同一個類中非事務(wù)方法調(diào)用事務(wù)方法時事務(wù)生效
        ((Demo) AopContext.currentProxy()).methodA();
        ...
    }      

    @Transactional(rollbackFor = Exception.class)
    public void methodB () {
        ...
    }      
}
  • 使用@Transactional聲明式事務(wù)
是否在同一個類 調(diào)用 事務(wù)是否生效
在不同類中 事務(wù)方法A調(diào)用非事務(wù)方法B 事務(wù)生效
在不同類中 非事務(wù)方法A調(diào)用事務(wù)方法B 事務(wù)生效
在同一個類中 事務(wù)方法A調(diào)用非事務(wù)方法B 事務(wù)具有傳播性,事務(wù)生效
在同一個類中 非事務(wù)方法A調(diào)用事務(wù)方法B 事務(wù)失效

轉(zhuǎn)載:http://www.reibang.com/p/2ab568e7aaf7

3. 編程式事務(wù)TransactionTemplate用法

public class Demo {

    @Resource
    private TransactionTemplate transactionTemplate;

    public void methodA () {
        ...
        // 指定事務(wù)傳播性(可不設(shè)置冯挎,默認(rèn)是`PROPAGATION_REQUIRED`)
         transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 指定事務(wù)隔離級別(可不設(shè)置底哥,默認(rèn)是`ISOLATION_DEFAULT`,同數(shù)據(jù)庫隔離級別)
        transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
        transactionTemplate.execute(transactionStatus -> {
            methodB();
            return Boolean.TRUE;
        });
        ...
    }      

    public void methodB () {
        ...
    }      
}
  • 事務(wù)傳播行為
1. TransactionDefinition.PROPAGATION_REQUIRED:
   如果當(dāng)前存在事務(wù)房官,則加入該事務(wù)趾徽;如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)翰守。這是默認(rèn)值孵奶。
 
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:
   創(chuàng)建一個新的事務(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)建一個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;
   如果當(dāng)前沒有事務(wù)芳来,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED含末。
  • 事務(wù)的隔離級別
1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會出現(xiàn)臟讀,
 不可重復(fù)讀) 基本不使用
 
2. @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會出現(xiàn)不可重復(fù)讀和幻讀)
 
3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重復(fù)讀(會出現(xiàn)幻讀)
 
4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市即舌,隨后出現(xiàn)的幾起案子佣盒,更是在濱河造成了極大的恐慌,老刑警劉巖顽聂,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肥惭,死亡現(xiàn)場離奇詭異,居然都是意外死亡紊搪,警方通過查閱死者的電腦和手機(jī)蜜葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗦明,“玉大人笼沥,你說我怎么就攤上這事∪⑴疲” “怎么了奔浅?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诗良。 經(jīng)常有香客問我汹桦,道長,這世上最難降的妖魔是什么鉴裹? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任舞骆,我火速辦了婚禮,結(jié)果婚禮上径荔,老公的妹妹穿的比我還像新娘督禽。我一直安慰自己,他們只是感情好总处,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布狈惫。 她就那樣靜靜地躺著,像睡著了一般鹦马。 火紅的嫁衣襯著肌膚如雪胧谈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天荸频,我揣著相機(jī)與錄音菱肖,去河邊找鬼。 笑死旭从,一個胖子當(dāng)著我的面吹牛稳强,可吹牛的內(nèi)容都是我干的场仲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼键袱,長吁一口氣:“原來是場噩夢啊……” “哼燎窘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹄咖,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褐健,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澜汤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚜迅,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年俊抵,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁尼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骡澈。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡价卤,死狀恐怖牡属,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谎替,我是刑警寧澤偷溺,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钱贯,受9級特大地震影響挫掏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秩命,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一尉共、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弃锐,春花似錦袄友、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浇辜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唾戚,已是汗流浹背柳洋。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叹坦,地道東北人熊镣。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绪囱。 傳聞我的和親對象是個殘疾皇子测蹲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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