成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

tuomao / 3542人閱讀

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

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

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

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

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




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

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

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

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

在應(yīng)用系統(tǒng)調(diào)用聲明@Transactional 的目標(biāo)方法時(shí),Spring Framework 默認(rèn)使用 AOP 代理,在代碼運(yùn)行時(shí)生成一個(gè)代理對(duì)象,根據(jù)@Transactional 的屬性配置信息,這個(gè)代理對(duì)象決定該聲明@Transactional 的目標(biāo)方法是否由攔截器 TransactionInterceptor 來使用攔截,在 TransactionInterceptor 攔截時(shí),會(huì)在在目標(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ù)使用注意事項(xiàng)

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

(1)正確的設(shè)置@Transactional 的 propagation 屬性
需要注意下面三種 propagation 可以不啟動(dòng)事務(wù)。本來期望目標(biāo)方法進(jìn)行事務(wù)管理,但若是錯(cuò)誤的配置這三種 propagation,事務(wù)將不會(huì)發(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 不會(huì)回滾事務(wù)。
如果在事務(wù)中拋出其他類型的異常,并期望 Spring 能夠回滾事務(wù),可以指定 rollbackFor。例:

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

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

清單 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ù)管理。這是因?yàn)樵谑褂?Spring AOP 代理時(shí),Spring 在調(diào)用在圖 1 中的 TransactionInterceptor 在目標(biāo)方法執(zhí)行前后進(jìn)行攔截之前,DynamicAdvisedInterceptor(CglibAopProxy 的內(nèi)部類)的的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法會(huì)間接調(diào)用 AbstractFallbackTransactionAttributeSource(Spring 通過這個(gè)類獲取表 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;}

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

(4)避免 Spring 的 AOP 的自調(diào)用問題
在 Spring 的 AOP 代理下,只有目標(biāo)方法由外部調(diào)用,目標(biāo)方法才由 Spring 生成的代理對(duì)象來管理,這會(huì)造成自調(diào)用問題。若同一類中的其他沒有@Transactional 注解的方法內(nèi)部調(diào)用有@Transactional 注解的方法,有@Transactional 注解的方法的事務(wù)被忽略,不會(huì)發(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ù)不會(huì)發(fā)生回滾。

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71596.html

相關(guān)文章

  • Java相關(guān)

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

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

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

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

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

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

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

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

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

0條評(píng)論

閱讀需要支付1元查看
<