zoukankan      html  css  js  c++  java
  • Spring7种事务传播行为类型--PROPAGATION_REQUIRED及其他6种事务传播行为种类

    PROPAGATION_REQUIRED及其他6种事务传播行为种类,有需要的朋友可以参考下。

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

  • 相关阅读:
    PHP7 网络编程(六)Socket和IO多路复用【待】
    PHP7 网络编程(五)进程间通信【待】
    PHP7 网络编程(四)signal信号【待】
    PHP7 网络编程(三)孤儿进程与僵尸进程
    PHP7 网络编程(二)daemon守护进程
    PHP7 网络编程(一)多进程初探
    为什么要用Rust取代C/C ++重写Python底层?
    Modern Self-Service Data Platforms
    一文读懂量化系统接入及相关平台
    rust asynchronous io:从 mio 到 coroutine
  • 原文地址:https://www.cnblogs.com/xuxiuxiu/p/7080660.html
Copyright © 2011-2022 走看看