乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      spring事務(wù)的annotation

       鷹皇軟件 2012-12-12
      一.annotation-driven如何正確使用事務(wù)管理器
      (本文僅基于3.0+版本作為測試)
      假定spring 容器中定義了兩個事務(wù)管理器:transactionManagerX,transactionManagerY,分管兩個數(shù)據(jù)源datasourceX和datasourceY.
      <tx:annotation-driven transaction-manager="transactionManagerX" />
      <tx:annotation-driven transaction-manager="transactionManagerY" />
      (spring容器中的定義順序如上)
      有如下應(yīng)用代碼:
      public interface TestEntityService {
      public void methodX();
      public void methodY();
      }
       
      接口實現(xiàn)類1
      public class TestEntityServiceImpl implements TestEntityService {
      @Resource
      private TestEntityDao testEntityDao;//實際操作的是datasourceX.
      @Transactional
      public void methodX() {
      testEntityDao.xxx();
      testEntityDao.zzz();
      }
      public void methodY() {
      }
      }
       
      接口實現(xiàn)類2
      public class AnotherTestEntityServiceImpl implements TestEntityService {
      @Resource
      private TestEntityDao anOtherTestEntityDao;//實際操作的是datasourceY.
      @Transactional
      public void methodX() {
      testEntityDao.mmm();
      testEntityDao.nnn();
      }
      public void methodY() {
      }
      }
      假設(shè)方法methodX需要事務(wù)控制的,通常我們是直接在方法上添加@Transactional標注,
      但是好像spring3.0(具體版本沒弄清)之前的Transactional標注不支持區(qū)分使用哪個事務(wù)管理器。3.0之后的版本Transactional增加了個string類型的value屬性來特殊指定加以區(qū)分。
      例如@Transactional("aaaaa"),即顯示的要求spring用id="aaaaa"的事務(wù)管理器來管理事務(wù)。該屬性亦可省略(省略的話用容器中缺省的transactionManager)
      對于該屬性的用法做了如下測試來
      methodX()事務(wù)生效測試結(jié)果
      @Transactional
      ("transactionManagerX")
       
      @Transactional
      ("transactionManagerY")
       
      @Transactional
      ("transactionManagerZ")
       transactionManagerZ為未定義過的
      @Transactional  
      TestEntityServiceImpl(實際使用datasourceX)
      Y
      N
      Y
      Y
      AnotherTestEntityServiceImpl (實際使用datasourceY)
      N
      Y
      N
      N
      如果調(diào)換兩個事務(wù)管理器在容器中的定義順序,如
      <tx:annotation-driven transaction-manager="transactionManagerY" />
      <tx:annotation-driven transaction-manager="transactionManagerX" />
      得到的結(jié)果
      methodX()事務(wù)生效測試結(jié)果
      @Transactional
      ("transactionManagerX")
       
      @Transactional
      ("transactionManagerY")
       
      @Transactional
      ("transactionManagerZ")
       transactionManagerZ為未定義過的
      @Transactional  
      TestEntityServiceImpl(實際使用datasourceX)
      Y
      N
      N
      N
      AnotherTestEntityServiceImpl (實際使用datasourceY)
      N
      Y
      Y
      Y
       
      分析結(jié)果(其實源碼就可以反應(yīng)出):容器指定一個默認的事務(wù)管理器
      1.當在@Transactional("xxx")中正確指定了需要使用的事務(wù)管理器時,事務(wù)控制正常。
      2.如果@Transactional指定了未定義過的事務(wù)管理器,spring以缺省默認的事務(wù)管理器來處理。(如果程序正好使用的是缺省事務(wù)管理器同一個數(shù)據(jù)源,事務(wù)控制將生效)。
      3.如果@Transactional不指定事務(wù)管理器,使用缺省。
      4.如果@Transactional指定了不匹配的事務(wù)管理器(實際用到的數(shù)據(jù)源和指定的事務(wù)管理器控制的數(shù)據(jù)源不一致),事務(wù)控制將失效.
      注:spring容器缺省事務(wù)管理器:以加載順序,首先加載的作為缺省。例如
      如果
      <tx:annotation-driven transaction-manager="transactionManagerX" />
      <tx:annotation-driven transaction-manager="transactionManagerY" />
      定義在同一個文件中,則第一個transactionManagerX作為缺省。
      定義在不同文件,則按文件的加載順序,首先加載的作為缺省。
       
      建議:實際代碼中需要用到@Transactional時,即使默認只有一個 transactionManager,@Transactional也將其標明。以提高新增數(shù)據(jù)源后代碼可讀性,另外防止定義多個數(shù)據(jù)源后,以前缺省的 不被spring默認為缺省了(比如哪天上線新定義了一個數(shù)據(jù)源,剛好新定義的transactionManager被先加載了,那就悲劇了。)
       
      二.bean的配置使用
      容器中加了<tx:annotation-driven >(需要增加一些xsd)之后,需要事務(wù)控制的的service,不需要再具體的bean上做其他的配置,例如用代理包裝。直接配置即可
      <bean id="testEntityService" class="com.xxx.impl.TestEntityServiceImpl"/>
      spring將由JdkDynamicAopProxy 生成代理過的類提供使用。
      這種用法的效果和下面配置使用效果一樣。都是由JdkDynamicAopProxy 生成代理對象提供使用。
      我覺得區(qū)別是下面的方法在事務(wù)控制的代碼可讀性上不好,因為哪個方法需要事務(wù)控制和控制粒度都在配置文件中,和代碼分開了。
      <bean id="testEntityService3" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
            <property name="transactionManager" ref="transactionManagerX" />
            <property name="target">
               <bean class="com.xxxx.impl.TestEntityServiceImpl" />
            </property>
            <property name="proxyInterfaces" value="com.xxxx.TestEntityService"/>
            <property name="transactionAttributes">
               <props>
                 <prop key="*">PROPAGATION_REQUIRED</prop>
               </props>
            </property>
      </bean>
       
      方法的可見度和 @Transactional
      @Transactional 注解應(yīng)該只被應(yīng)用到 public 可見度的方法上。 如果你在 protected、private 或 者 package-visible 的方法上使用 @Transactional 注解,它也不會報錯, 但是這個被注解的方法將不會展示已配置的事務(wù) 設(shè)置。
      @Transactional 注解可以被應(yīng)用于接口定義和接口方法、類定義和類的 public 方法上。然而,請注意僅 僅 @Transactional 注解的出現(xiàn)不足于開啟事務(wù)行為,它僅僅 是一種元數(shù)據(jù),能夠被可以識別 @Transactional 注解和上述的 配置適當?shù)木哂惺聞?wù)行為的beans所使用。上面的例子中,其實正是 <tx:annotation-driven/>元素的出現(xiàn) 開啟 了 事務(wù)行為。
      Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實現(xiàn)的任何接口上。你當 然可以在接口上使用 @Transactional 注解,但是這將只能當你設(shè)置了基于接口的代理時它才生效。因為注解是 不能繼承 的。
       
      實際開發(fā)中,多半喜歡將持久化操作的代碼集中抽出為另一個方法(因為不想事務(wù)被無關(guān)的業(yè)務(wù)代碼托的持續(xù)太長),然后在抽取出來的方法上加上 @Transactional,這樣的結(jié)果是被抽離出的代碼即使加了事務(wù)標記,也根本起不到事務(wù)控制的效果(不管是private和public)。
      例如:
      public class TestEntityServiceImpl implements TestEntityService {
      @Resource
      private TestEntityDao testEntityDao;//實際操作的是datasourceX.
      @Transactional
      public void methodX() {
      testEntityDao.xxx();
      testEntityDao.zzz();
      }
      public void methodY() {
      methodX() 
      }
      }
      如果執(zhí)行TestEntityService.methodY();事務(wù)是不生效的。只有TestEntityService.methodY();才生效。
      從spring實現(xiàn)這些的原理(動態(tài)代理和aop)上來看,只攔截外部調(diào)用,方法的內(nèi)部調(diào)用通常是不被aop支持的。
      從網(wǎng)上扒到一篇文章,可以解決這個問題。http://blog.csdn.net/quzishen/archive/2010/08/11/5803721.aspx
      分享到:
      評論
      2 樓 newlifewant 2012-09-23  
        still thanks !
      1 樓 mzy0316 2012-08-09  
      這里是哪里抄來的舊聞.
      spring從2.5開始,就已經(jīng)支持注解式事務(wù)的繼承了.而且不需要任何多余配置

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多