Spring 事務(wù)之聲明式事務(wù)

一.聲明式事務(wù)實現(xiàn)
  • 將編程式事務(wù)章節(jié)中applicationContext.xml修改下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- 加載jdbc.property -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
              <list>
                <value>classpath:jdbc.properties</value> 
              </list>
        </property>
    </bean>
    <!-- 數(shù)據(jù)源配置, 使用DBCP數(shù)據(jù)庫連接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!-- Connection Pooling Info -->
        <property name="maxActive" value="3"/>
        <property name="defaultAutoCommit" value="false"/>
        <!-- 連接Idle一個小時后超時 -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000"/>
        <property name="minEvictableIdleTimeMillis" value="3600000"/>
    </bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">    
        <property name="dataSource" ref="dataSource"/>  
    </bean> 
    
    <bean id="abstractDao" abstract="true">
        <property name="dataSource" ref="dataSource"/>  
    </bean>
    
    <bean id="userDao" class="transaction.dao.UserDaoImp" parent="abstractDao"/>  
    <bean id="addressDao" class="transaction.dao.AddressDaoImp" parent="abstractDao"/>
    
    <bean id="userService" class="transaction.service.UserServiceImp">
        <property name="addressService" ref="addressService"/>
        <property name="userDao" ref="userDao"/>
    </bean>  
    
    <bean id="addressService" class="transaction.service.AddressServiceImp">
        <property name="addressDao" ref="addressDao"/>
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
            <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut expression="execution(* transaction.service.*Imp.*(..))" id="serviceMethod" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
    </aop:config> 
</beans>

聲明式事務(wù)通過AOP代理方式實現(xiàn)事務(wù)管理琅坡,利用環(huán)繞通知TransactionInterceptor實現(xiàn)事務(wù)的開啟及關(guān)閉肾砂,而TransactionProxyFactoryBean內(nèi)部也是通過該環(huán)繞通知實現(xiàn)的,因此可以認(rèn)為是<tx:tags/>幫你定義了TransactionProxyFactoryBean,從而簡化事務(wù)管理

二.<tx:advice/>配置
<tx:advice id="……" transaction-manager="……">  
<tx:attributes>  
        <tx:method name="……"  
                           propagation=" REQUIRED"  
                           isolation="READ_COMMITTED"  
                           timeout="-1"  
                           read-only="false"  
                           no-rollback-for=""   
                           rollback-for=""/>  
        ……  
    </tx:attributes>  
</tx:advice> 
  • <tx:advice>:id用于指定此通知的名字竞漾, transaction-manager用于指定事務(wù)管理器,默認(rèn)的事務(wù)管理器名字為“transactionManager”;
  • <tx:method>:用于定義事務(wù)屬性即相關(guān)聯(lián)的方法名怖喻;
    name:定義與事務(wù)屬性相關(guān)聯(lián)的方法名,將對匹配的方法應(yīng)用定義的事務(wù)屬性岁诉,可以使用“”通配符來匹配一組或所有方法锚沸,如save將匹配以save開頭的方法,而“”將匹配所有方法涕癣;
    propagation:事務(wù)傳播行為定義哗蜈,默認(rèn)為“REQUIRED”,表示Required坠韩,其值可以通過TransactionDefinition的靜態(tài)傳播行為變量的“PROPAGATION_”后邊部分指定距潘,如“TransactionDefinition.PROPAGATION_REQUIRED”可以使用“REQUIRED”指定;
    isolation: 事務(wù)隔離級別定義只搁;默認(rèn)為“DEFAULT”绽昼,其值可以通過TransactionDefinition的靜態(tài)隔離級別變量的“ISOLATION_”后邊部分指定,如“TransactionDefinition. ISOLATION_DEFAULT”可以使用“DEFAULT”指定:
    timeout:事務(wù)超時時間設(shè)置须蜗,單位為秒硅确,默認(rèn)-1目溉,表示事務(wù)超時將依賴于底層事務(wù)系統(tǒng);
    read-only:事務(wù)只讀設(shè)置菱农,默認(rèn)為false缭付,表示不是只讀;
    rollback-for:需要觸發(fā)回滾的異常定義循未,以“陷猫,”分割,默認(rèn)任何RuntimeException 將導(dǎo)致事務(wù)回滾的妖,而任何Checked Exception 將不導(dǎo)致事務(wù)回滾绣檬;異常名字定義和TransactionProxyFactoryBean中含義一樣
    no-rollback-for:不被觸發(fā)進(jìn)行回滾的 Exception(s);以“嫂粟,”分割娇未;異常名字定義和TransactionProxyFactoryBean中含義一樣;
三.多事務(wù)語義配置
  • 明式事務(wù)配置的最佳實踐
<tx:advice id="txAdvice" transaction-manager="transactionManager">  
<tx:attributes>  
           <tx:method name="save*" propagation="REQUIRED" />  
           <tx:method name="add*" propagation="REQUIRED" />  
           <tx:method name="create*" propagation="REQUIRED" />  
           <tx:method name="insert*" propagation="REQUIRED" />  
           <tx:method name="update*" propagation="REQUIRED" />  
           <tx:method name="merge*" propagation="REQUIRED" />  
           <tx:method name="del*" propagation="REQUIRED" />  
           <tx:method name="remove*" propagation="REQUIRED" />  
           <tx:method name="put*" propagation="REQUIRED" />  
           <tx:method name="get*" propagation="SUPPORTS" read-only="true" />  
           <tx:method name="count*" propagation="SUPPORTS" read-only="true" />  
          <tx:method name="find*" propagation="SUPPORTS" read-only="true" />  
          <tx:method name="list*" propagation="SUPPORTS" read-only="true" />  
          <tx:method name="*" propagation="SUPPORTS" read-only="true" />  
       </tx:attributes>  
</tx:advice>  
<aop:config>
        <aop:pointcut expression="execution(* transaction.service.*Imp.*(..))" id="serviceMethod" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config> 
四.@Transactional實現(xiàn)事務(wù)管理
  • @Transactional配置
 @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
    public void save(final User user){
        userDao.save(user);  
        user.getAddress().setUserId(user.getId());  
        addressService.save(user.getAddress());
        throw new RuntimeException();
    }

    @Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,readOnly=true)
    public int countAll() {
        return userDao.countAll();
    }
  • 開啟@Transactional注解支持
<tx:annotation-driven proxy-target-class="false" transaction-manager="transactionManager" order="1"/>
  • Spring提供的<tx:annotation-driven/>用于開啟對注解事務(wù)管理的支持星虹,從而能識別Bean類上的@Transactional注解元數(shù)據(jù)零抬,其具有以下屬性:
    transaction-manager: 指定事務(wù)管理器名字,默認(rèn)為transactionManager宽涌,當(dāng)使用其他名字時需要明確指定平夜;
    proxy-target-class: 表示將使用的代碼機制,默認(rèn)false表示使用JDK代理卸亮,如果為true將使用CGLIB代理
    order: 定義事務(wù)通知順序忽妒,默認(rèn)Ordered.LOWEST_PRECEDENCE,表示將順序決定權(quán)交給AOP來處理兼贸。

  • Spring使用@Transaction來指定事務(wù)屬性段直,可以在接口、類或方法上指定寝受,如果類和方法上都指定了@Transaction,則方法上的事務(wù)屬性被優(yōu)先使用罕偎,具體屬性如下:
    value: 指定事務(wù)管理器名字很澄,默認(rèn)使用<tx:annotation-driven/>指定的事務(wù)管理器,用于支持多事務(wù)管理器環(huán)境颜及;
    propagation:指定事務(wù)傳播行為甩苛,默認(rèn)為Required,使用Propagation.REQUIRED指定俏站;
    isolation:指定事務(wù)隔離級別讯蒲,默認(rèn)為“DEFAULT”,使用Isolation.DEFAULT指定肄扎;
    readOnly:指定事務(wù)是否只讀墨林,默認(rèn)false表示事務(wù)非只讀赁酝;
    timeout:指定事務(wù)超時時間,以秒為單位旭等,默認(rèn)-1表示事務(wù)超時將依賴于底層事務(wù)系統(tǒng)酌呆;
    rollbackFor:指定一組異常類,遇到該類異常將回滾事務(wù)搔耕;
    rollbackForClassname:指定一組異常類名字隙袁,其含義與<tx:method>中的rollback-for屬性語義完全一樣;
    noRollbackFor:指定一組異常類弃榨,即使遇到該類異常也將提交事務(wù)菩收,即不回滾事務(wù);
    noRollbackForClassname:指定一組異常類名字鲸睛,其含義與<tx:method>中的no-rollback-for屬性語義完全一樣娜饵;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腊凶,隨后出現(xiàn)的幾起案子划咐,更是在濱河造成了極大的恐慌,老刑警劉巖钧萍,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐缠,死亡現(xiàn)場離奇詭異,居然都是意外死亡风瘦,警方通過查閱死者的電腦和手機队魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來万搔,“玉大人胡桨,你說我怎么就攤上這事∷脖ⅲ” “怎么了昧谊?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酗捌。 經(jīng)常有香客問我呢诬,道長,這世上最難降的妖魔是什么胖缤? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任尚镰,我火速辦了婚禮,結(jié)果婚禮上哪廓,老公的妹妹穿的比我還像新娘狗唉。我一直安慰自己,他們只是感情好涡真,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布分俯。 她就那樣靜靜地躺著肾筐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澳迫。 梳的紋絲不亂的頭發(fā)上局齿,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音橄登,去河邊找鬼抓歼。 笑死,一個胖子當(dāng)著我的面吹牛拢锹,可吹牛的內(nèi)容都是我干的谣妻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼卒稳,長吁一口氣:“原來是場噩夢啊……” “哼蹋半!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起充坑,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤减江,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捻爷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辈灼,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年也榄,在試婚紗的時候發(fā)現(xiàn)自己被綠了巡莹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡甜紫,死狀恐怖降宅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囚霸,我是刑警寧澤腰根,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拓型,受9級特大地震影響额嘿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吨述,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一岩睁、第九天 我趴在偏房一處隱蔽的房頂上張望钞脂。 院中可真熱鬧揣云,春花似錦、人聲如沸冰啃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焚刚,卻和暖如春点弯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矿咕。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工抢肛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碳柱。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓捡絮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莲镣。 傳聞我的和親對象是個殘疾皇子福稳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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

  • 5.Spring的事務(wù) 通常情況下,J2EE有2種事務(wù)管理方式:全局事務(wù)和本地事務(wù)瑞侮,2種事務(wù)都比較明顯的缺陷的圆。 全...
    FTOLsXD閱讀 1,502評論 0 8
  • 這部分的參考文檔涉及數(shù)據(jù)訪問和數(shù)據(jù)訪問層和業(yè)務(wù)或服務(wù)層之間的交互。 Spring的綜合事務(wù)管理支持覆蓋很多細(xì)節(jié)半火,然...
    竹天亮閱讀 1,033評論 0 0
  • 1.IOC與DI inverse of control 控制反轉(zhuǎn)我們創(chuàng)建對象的方式反轉(zhuǎn)了越妈。以前對象的創(chuàng)建由開發(fā)人員...
    蕊er閱讀 316評論 0 0
  • Spring 復(fù)習(xí) [toc] spring介紹 三層架構(gòu)中spring位置,連接三層慈缔。 spring一站式框架正...
    inke閱讀 747評論 0 11
  • 一> 程序中事務(wù)控制 環(huán)境準(zhǔn)備 : 用戶訪問—》Action --》 Service---》Dao 一個業(yè)務(wù)的成...
    奮斗的老王閱讀 1,130評論 0 51