成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

@Transactional事務(wù)生效問題

tomorrowwu / 1608人閱讀

摘要:情況一方法方法強(qiáng)制拋一個(gè)異常情況一就是這樣,方法里面順序調(diào)用兩個(gè)方法,方法不加事務(wù)注解,方法加了事務(wù)注解。如果不了解事務(wù)的傳播性,可能會(huì)回答成功插入,插入失敗但是實(shí)際情況卻是均插入成功了。

平時(shí)我們使用spring框架,不論是springmvcv還是springboot,springCloud,絕大多數(shù)情況我們都是在方法,或者直接在類上面加一個(gè)@Transactional,將事務(wù)交給spring替我們?nèi)ス芾?,然后并沒有具體分析一些情況,今天結(jié)合幾個(gè)例子,結(jié)合源代碼,使用偽代碼解釋一波。

1.情況一
   service(){
       //方法A
       methodA(){
           insertA();
       }
       //方法B
       @Transactional
       methodB(){
           insertB();
           throw new RunTimeException("強(qiáng)制拋一個(gè)異常");
       }
       public void static main(String[] args){
           methodA();
           methodB();
       }
   }

情況一就是這樣,main方法里面順序調(diào)用AB兩個(gè)方法,A方法不加事務(wù)注解,B方法加了事務(wù)注解。如果不了解@Transactional 事務(wù)的傳播性,可能會(huì)回答:A成功插入,B插入失敗,但是實(shí)際情況卻是A,B均插入成功了。到底是什么原因呢?這里先簡單介紹一下事務(wù)的6個(gè)傳播屬性:

PROPAGATION_REQUIRED : 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù),這也是最常見的
PROPAGATION_SUPPORTS : 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)的方式執(zhí)行
PROPAGATION_MANDATORY: 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋異常
PROPAGATION_REQUIRES_NEW:新建事務(wù),如果當(dāng)前事務(wù)存在,就把當(dāng)前事務(wù)掛起
PROPAGATION_NOT_SUPPORTED:以非事務(wù)的方式執(zhí)行,如果存在當(dāng)前事務(wù),就把當(dāng)前事務(wù)掛起
PROPAGATION_NEVER: 以非事務(wù)的方式執(zhí)行,如果當(dāng)前存在事務(wù),就拋異常
PROPAGATION_NESTED:如果存在當(dāng)前事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則新建一個(gè)事務(wù)

前六個(gè)策略類似于EJB CMT,第七個(gè)(PROPAGATION_NESTED)是Spring所提供的一個(gè)特殊變量。

研究源碼,調(diào)試程序可以看到:
A沒有事務(wù)管理,則線程內(nèi)的connection 有個(gè)autoCommit = true
B得到事務(wù)的時(shí)候,由于事務(wù)的傳播性依然生效, 得到的還是A方法的commit,其autoCommit = true,故而逐條sql進(jìn)行提交,即A,B都會(huì)插入

下面我們來分析情況二:
serviceA(){
    methodA(){
        insertA();
    }
} 
serviceB(){
    @Transactional
    methodB(){
        insertB();
        throw new RuntimeExcption("強(qiáng)制拋出的異常");
    }
}
serviceC(){
    @Autowired
    private ServiceA serviceA;
    @Autowired
    private ServiceB serviceB;

    public void staic main(String[] args){
        serviceA.methodA();
        serviceB.methodB();
    }
}


情況二的主要代碼和情況一一樣,都是要調(diào)用methodA和methodB,但是結(jié)果卻不同,情況二的正確結(jié)果是指揮插入A,而B會(huì)回滾,這是為什么呢?同樣是在B方法上面加了事務(wù)注解....

其實(shí)大家都知道,spring的事務(wù)是交由cglib動(dòng)態(tài)代理的,而動(dòng)態(tài)代理對(duì)象產(chǎn)生的時(shí)機(jī)就非常重要了。再回到本例子:

A:在同一個(gè)service內(nèi)部,事務(wù)之間嵌套調(diào)用,普通方法和事務(wù)方法之間的嵌套調(diào)用,都不會(huì)開啟新的事務(wù)(因?yàn)閟hpring使用的是動(dòng)態(tài)代理的方式來控制的事務(wù),而動(dòng)態(tài)代理最終都是要調(diào)用原始對(duì)象的,而原始對(duì)象在調(diào)用方法時(shí),已存在代理對(duì)象,是不會(huì)再觸發(fā)代理了!)
B:兩個(gè)方法在不同的service里(即不同的對(duì)象,即代理對(duì)象也不是同一個(gè)),在ServiceC中,使用注入的方式將serviceA和serviceB注入,這樣即使A沒有使用事務(wù),B也有自己的代理,會(huì)根據(jù)PROPAGATION_REQUIRED 而生成新的事務(wù).

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73590.html

相關(guān)文章

  • 【Spring】一次線上@Transational事務(wù)注解未生效的原因探究

    摘要:由于的限制,無法替換被代理類已經(jīng)被載入的字節(jié)碼,只能生成并載入一個(gè)新的子類作為代理類,被代理類的字節(jié)碼依然存在于中。區(qū)別于前兩者,是一種靜態(tài)代理的實(shí)現(xiàn),即在編譯時(shí)或者載入類時(shí)直接修改被代理類文件的字節(jié)碼,而非運(yùn)行時(shí)實(shí)時(shí)生成代理。 現(xiàn)象描述 上周同事發(fā)現(xiàn)其基于mySql實(shí)現(xiàn)的分布式鎖的線上代碼存在問題,代碼簡化如下: @Controller class XService { @A...

    姘存按 評(píng)論0 收藏0
  • Spring 踩坑之@Transactional 神奇失效

    摘要:引言對(duì)于追求數(shù)據(jù)強(qiáng)一致性的系統(tǒng),事務(wù)扮演者十分重要的角色最近在項(xiàng)目中遇到一個(gè)事務(wù)失效的問題,在此分享給大家。情景回放問題分析初步分析這是事務(wù)獲取鎖超時(shí)導(dǎo)致的錯(cuò)誤,奇怪的是拋出異常但是事務(wù)沒有回滾。唯一的解釋是事務(wù)失效了。 引言 對(duì)于追求數(shù)據(jù)強(qiáng)一致性的系統(tǒng),事務(wù)扮演者十分重要的角色.最近在項(xiàng)目中遇到一個(gè)事務(wù)失效的問題,在此分享給大家。 情景回放 ### Cause: com.mysql....

    derek_334892 評(píng)論0 收藏0
  • 面試分享:最全Spring事務(wù)面試考點(diǎn)整理

    摘要:和事務(wù)的關(guān)系關(guān)系型數(shù)據(jù)庫某些消息隊(duì)列等產(chǎn)品或中間件稱為事務(wù)性資源,因?yàn)樗鼈儽旧碇С质聞?wù),也能夠處理事務(wù)。事務(wù)的傳播特性,,,,,,強(qiáng)制要求要有一個(gè)物理事務(wù)。外圍事務(wù)不會(huì)被內(nèi)部事務(wù)的回滾狀態(tài)影響。不支持當(dāng)前事務(wù)。 Spring和事務(wù)的關(guān)系 關(guān)系型數(shù)據(jù)庫、某些消息隊(duì)列等產(chǎn)品或中間件稱為事務(wù)性資源,因?yàn)樗鼈儽旧碇С质聞?wù),也能夠處理事務(wù)。 Spring很顯然不是事務(wù)性資源,但是它可...

    graf 評(píng)論0 收藏0
  • spring事務(wù)處理

    摘要:聲明式事務(wù)管理的事務(wù)管理是通過代理實(shí)現(xiàn)的。其中的事務(wù)通知由元數(shù)據(jù)目前基于或注解驅(qū)動(dòng)。代理對(duì)象與事務(wù)元數(shù)據(jù)結(jié)合產(chǎn)生了一個(gè)代理,它使用一個(gè)實(shí)現(xiàn)品配合,在方法調(diào)用前后實(shí)施事務(wù)。 JDBC事務(wù) 1.獲取連接 Connection con=DriverManager.getConnection(); 2.開啟事務(wù) con.setAutoCommit(true/fase); 3.執(zhí)行CRUD 4....

    李文鵬 評(píng)論0 收藏0
  • 在同一個(gè)類中調(diào)用另一個(gè)方法沒有觸發(fā) Spring AOP 的問題

    摘要:起因考慮如下一個(gè)例子定義在這個(gè)例子中我們定義了一個(gè)注解這個(gè)是一個(gè)方法注解我們的期望是當(dāng)有此注解的方法被調(diào)用時(shí)需要執(zhí)行指定的切面邏輯即執(zhí)行方法在類中方法被所注解因此調(diào)用方法時(shí)應(yīng)該會(huì)觸發(fā)方法的調(diào)用不過有一點(diǎn)我 起因 考慮如下一個(gè)例子: @Target(value = {ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Doc...

    yimo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<