• 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");

  • 相关阅读:
    在jenkins中新建节点,启动方式中没有“通过java web启动”
    在jenkins上执行web自动化脚本出现cannot find Chrome binary
    修改禅道的默认端口
    jmeter修改字体大小
    电脑中安装了两个版本的jdk,后装的会把第一个覆盖掉
    各种浏览器的驱动
    js中的null和undefined总结
    关于 es6的 let 特性在 for 循环结构 的个人理解
    ajax五,jsonp跨域的本质
    ajax四,封装ajax并优化
  • 原文地址:https://www.cnblogs.com/originate918/p/6226342.html
Copyright © 2020-2023  润新知