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

資訊專欄INFORMATION COLUMN

Spring知識——事務(wù)解析

tuomao / 3491人閱讀

摘要:編程式事務(wù)指的是通過編碼方式實現(xiàn)事務(wù)聲明式事務(wù)基于將具體業(yè)務(wù)邏輯與事務(wù)處理解耦。聲明式事務(wù)管理使業(yè)務(wù)代碼邏輯不受污染因此在實際使用中聲明式事務(wù)用的比較多。聲明式事務(wù)有兩種方式,一種是在配置文件中做相關(guān)的事務(wù)規(guī)則聲明,另一種是基于注解的方式。

事務(wù)管理是應(yīng)用系統(tǒng)開發(fā)中必不可少的一部分。Spring 為事務(wù)管理提供了豐富的功能支持。Spring 事務(wù)管理分為編碼式和聲明式的兩種方式。編程式事務(wù)指的是通過編碼方式實現(xiàn)事務(wù);聲明式事務(wù)基于 AOP,將具體業(yè)務(wù)邏輯與事務(wù)處理解耦。聲明式事務(wù)管理使業(yè)務(wù)代碼邏輯不受污染, 因此在實際使用中聲明式事務(wù)用的比較多。聲明式事務(wù)有兩種方式,一種是在配置文件(xml)中做相關(guān)的事務(wù)規(guī)則聲明,另一種是基于@Transactional 注解的方式。注釋配置是目前流行的使用方式,因此本文將著重介紹基于@Transactional 注解的事務(wù)管理。

1、@Transactional 注解管理事務(wù)的實現(xiàn)步驟

第一步:在 xml 配置文件中添加如清單 1 的事務(wù)配置信息。除了用配置文件的方式,@EnableTransactionManagement 注解也可以啟用事務(wù)管理功能。這里以簡單的 DataSourceTransactionManager 為例。

清單 1. 在 xml 配置中的事務(wù)配置信息




第二步將@Transactional 注解添加到合適的方法上,并設(shè)置合適的屬性信息。@Transactional 注解的屬性信息如表 1 展示。

表 1. @Transactional 注解的屬性信息
屬性名    說明
name    當(dāng)在配置文件中有多個 TransactionManager , 可以用該屬性指定選擇哪個事務(wù)管理器。
propagation    事務(wù)的傳播行為,默認(rèn)值為 REQUIRED。詳細(xì)見:https://blog.csdn.net/soonfly/article/details/70305683
isolation    事務(wù)的隔離度,默認(rèn)值采用 DEFAULT。
timeout    事務(wù)的超時時間,默認(rèn)值為-1。如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。
read-only    指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true。
rollback-for    用于指定能夠觸發(fā)事務(wù)回滾的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗號分隔。
no-rollback- for    拋出 no-rollback-for 指定的異常類型,不回滾事務(wù)。

Spring事務(wù)隔離級別(5種)
DEFAULT 這是一個PlatfromTransactionManager默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別.
未提交讀(read uncommited) :臟讀,不可重復(fù)讀,虛讀都有可能發(fā)生
已提交讀 (read commited):避免臟讀。但是不可重復(fù)讀和虛讀有可能發(fā)生
可重復(fù)讀 (repeatable read) :避免臟讀和不可重復(fù)讀.但是虛讀有可能發(fā)生.
串行化的 (serializable) :避免以上所有讀問題.

2、Spring 的注解方式的事務(wù)實現(xiàn)機(jī)制

在應(yīng)用系統(tǒng)調(diào)用聲明@Transactional 的目標(biāo)方法時,Spring Framework 默認(rèn)使用 AOP 代理,在代碼運(yùn)行時生成一個代理對象,根據(jù)@Transactional 的屬性配置信息,這個代理對象決定該聲明@Transactional 的目標(biāo)方法是否由攔截器 TransactionInterceptor 來使用攔截,在 TransactionInterceptor 攔截時,會在在目標(biāo)方法開始執(zhí)行之前創(chuàng)建并加入事務(wù),并執(zhí)行目標(biāo)方法的邏輯, 最后根據(jù)執(zhí)行情況是否出現(xiàn)異常,利用抽象事務(wù)管理器(圖 2 有相關(guān)介紹)AbstractPlatformTransactionManager 操作數(shù)據(jù)源 DataSource 提交或回滾事務(wù), 如圖 1 所示。

3、注解方式的事務(wù)使用注意事項

當(dāng)您對 Spring 的基于注解方式的實現(xiàn)步驟和事務(wù)內(nèi)在實現(xiàn)機(jī)制有較好的理解之后,就會更好的使用注解方式的事務(wù)管理,避免當(dāng)系統(tǒng)拋出異常,數(shù)據(jù)不能回滾的問題。

(1)正確的設(shè)置@Transactional 的 propagation 屬性
需要注意下面三種 propagation 可以不啟動事務(wù)。本來期望目標(biāo)方法進(jìn)行事務(wù)管理,但若是錯誤的配置這三種 propagation,事務(wù)將不會發(fā)生回滾。

TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。

(2)正確的設(shè)置@Transactional 的 rollbackFor 屬性
默認(rèn)情況下,如果在事務(wù)中拋出了未檢查異常(繼承自 RuntimeException 的異常)或者 Error,則 Spring 將回滾事務(wù);除此之外,Spring 不會回滾事務(wù)。
如果在事務(wù)中拋出其他類型的異常,并期望 Spring 能夠回滾事務(wù),可以指定 rollbackFor。例:

@Transactional(propagation= Propagation.REQUIRED,rollbackFor= MyException.class)

通過分析 Spring 源碼可以知道,若在目標(biāo)方法中拋出的異常是 rollbackFor 指定的異常的子類,事務(wù)同樣會回滾。

清單 3. RollbackRuleAttribute 的 getDepth 方法

private int getDepth(Class exceptionClass, int depth) {
        if (exceptionClass.getName().contains(this.exceptionName)) {
            // Found it!
            return depth;
}
        // If we"ve gone as far as we can go and haven"t found it...
        if (exceptionClass == Throwable.class) {
            return -1;
}
return getDepth(exceptionClass.getSuperclass(), depth + 1);
}

(3)@Transactional 只能應(yīng)用到 public 方法才有效
只有@Transactional 注解應(yīng)用到 public 方法,才能進(jìn)行事務(wù)管理。這是因為在使用 Spring AOP 代理時,Spring 在調(diào)用在圖 1 中的 TransactionInterceptor 在目標(biāo)方法執(zhí)行前后進(jìn)行攔截之前,DynamicAdvisedInterceptor(CglibAopProxy 的內(nèi)部類)的的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法會間接調(diào)用 AbstractFallbackTransactionAttributeSource(Spring 通過這個類獲取表 1. @Transactional 注解的事務(wù)屬性配置屬性信息)的 computeTransactionAttribute 方法。

清單 4. AbstractFallbackTransactionAttributeSource

protected TransactionAttribute computeTransactionAttribute(Method method,
    Class targetClass) {
        // Don"t allow no-public methods as required.
        if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
return null;}

這個方法會檢查目標(biāo)方法的修飾符是不是 public,若不是 public,就不會獲取@Transactional 的屬性配置信息,最終會造成不會用 TransactionInterceptor 來攔截該目標(biāo)方法進(jìn)行事務(wù)管理。

(4)避免 Spring 的 AOP 的自調(diào)用問題
在 Spring 的 AOP 代理下,只有目標(biāo)方法由外部調(diào)用,目標(biāo)方法才由 Spring 生成的代理對象來管理,這會造成自調(diào)用問題。若同一類中的其他沒有@Transactional 注解的方法內(nèi)部調(diào)用有@Transactional 注解的方法,有@Transactional 注解的方法的事務(wù)被忽略,不會發(fā)生回滾。見清單 5 舉例代碼展示。

清單 5.自調(diào)用問題舉例

@Service
-->public class OrderService {
    private void insert() {
insertOrder();
}
@Transactional
    public void insertOrder() {
        //insert log info
        //insertOrder
        //updateAccount
       }
}

insertOrder 盡管有@Transactional 注解,但它被內(nèi)部方法 insert 調(diào)用,事務(wù)被忽略,出現(xiàn)異常事務(wù)不會發(fā)生回滾。

參考:
https://www.ibm.com/developer...
https://blog.csdn.net/soonfly...

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

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

相關(guān)文章

  • Java相關(guān)

    摘要:本文是作者自己對中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...

    wangtdgoodluck 評論0 收藏0
  • 【備戰(zhàn)春招/秋招系列】美團(tuán)面經(jīng)總結(jié)基礎(chǔ)篇 (附詳解答案)

    摘要:不同于個人面經(jīng),這份面經(jīng)具有普適性。我在前面的文章中也提到了應(yīng)該怎么做自我介紹與項目介紹,詳情可以查看這篇文章備戰(zhàn)春招秋招系列初出茅廬的程序員該如何準(zhǔn)備面試。是建立連接時使用的握手信號。它表示確認(rèn)發(fā)來的數(shù)據(jù)已經(jīng)接受無誤。 showImg(https://segmentfault.com/img/remote/1460000016972448?w=921&h=532); 該文已加入開源文...

    Leck1e 評論0 收藏0
  • Spring IOC知識點一網(wǎng)打盡!

    摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統(tǒng)一配置,便于修改。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學(xué)習(xí)了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實戰(zhàn)》...

    djfml 評論0 收藏0
  • 【推薦】最新200篇:技術(shù)文章整理

    摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實現(xiàn)故障恢復(fù)自動化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯過的技術(shù)要點大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...

    BicycleWarrior 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<