Transaction事務傳播行為種類PROPAGATION_REQUIRED


事務傳播行為種類

Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:

表1事務傳播行為類型

事務傳播行為類型

說明

PROPAGATION_REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

當使用PROPAGATION_NESTED時,底層的數據源必須基於JDBC 3.0,並且實現者需要支持保存點事務機制。

 

<!--Hibernate事務管理器-->

<bean id="transactionManager"    

   class="org.springframework.orm.hibernate3.HibernateTransactionManager">    

   <property name="sessionFactory">     

     <ref bean="sessionFactory" />    

     </property>

</bean>

<!-- 定義事務攔截器bean-->

<bean id="transactionInterceptor"    

     class="org.springframework.transaction.interceptor.TransactionInterceptor">    

     <!-- 事務攔截器bean需要依賴注入一個事務管理器-->    

     <property name="transactionManager" ref="transactionManager" />    

     <property name="transactionAttributes">     

     <!-- 下面定義事務傳播屬性-->     

     <props>      

     <prop key="save*">PROPAGATION_REQUIRED</prop>      

     <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>      

     <prop key="delete*">PROPAGATION_REQUIRED</prop>      

     <prop key="update*">PROPAGATION_REQUIRED</prop>      

     <prop key="*">PROPAGATION_REQUIRED</prop>     

     </props>    

      </property>

    </bean>


   <bean id="managerTemplate" abstract="true" lazy-init="true">

   <property name="teamDao">    

       <ref bean="teamDao" />

   </property>

   <property name="studentDao">    

       <ref bean="studentDao" />

   </property>    

  </bean>


<bean id ="manager" class="com.zd.service.impl.Manager" parent="managerTemplate" />


<!-- 定義BeanNameAutoProxyCreator-->     

       <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

       <!-- 指定對滿足哪些bean name的bean自動生成業務代理 -->

       <property name="beanNames">            

              <!-- 下面是所有需要自動創建事務代理的bean-->

              <list>

                <value>manager</value>

              </list>             

              <!-- 此處可增加其他需要自動創建事務代理的bean-->

         </property>         

           <!-- 下面定義BeanNameAutoProxyCreator所需的事務攔截器-->

           <property name="interceptorNames">

               <list>                 

                   <!-- 此處可增加其他新的Interceptor -->

                   <value>transactionInterceptor</value>

               </list>

           </property>

        </bean>

  <!-- 基本數據庫操作 -->

  <bean id="baseDao" class="com.zd.service.impl.BaseDao">

       <property name="hibernateTemplate">

      <ref bean="hibernateTemplate"/>

    </property>

  </bean>

  <!-- 班級 -->

  <bean id="teamDao" class="com.zd.service.impl.TeamDao">

      <property name="baseDao">

          <ref bean="baseDao" />

      </property>

   </bean>

   <!-- 學生 -->

   <bean id="studentDao" class="com.zd.service.impl.StudentDao">

        <property name="baseDao">

            <ref bean="baseDao" />

        </property> </bean>

 

  public void testSaveTeam() {

     Team team = new Team();

     team.setTeamId(DBKeyCreator.getRandomKey(12));

     team.setTeamName("Class CCC");

     IManager manager = (IManager) SpringContextUtil.getContext().getBean("manager");  

 

     Student student = new Student();

     student.setStudentId(DBKeyCreator.getRandomKey(13));

     student.setSex(Student.SEX_FEMALE);

     student.setStudentName("Tom");

     student.setTeamId("60FHDXDIG5JQ");

     manager.saveTeamAndStu(team, student);

     System.out.println("Save Team and Student Success");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM