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

  • 相关阅读:
    2018.12.1 区块链论文翻译
    2018.11.29 区块链论文翻译
    jshell 一个代码片段测试工具(jdk9后新增的功能)
    java 的var 定义变量有点鸡肋...
    小心Math.abs(-2147483648)的坑
    java获取同级目录下的文件
    java获取formdata里的所有参数
    No enclosing instance of type VolatleTest is accessible. Must qualify the allocation with an enclosing instance of type VolatleTest
    if else太多怎么代替,太难维护?可以使用spring-plugin 插件系统
    设计一个泛型的获取数组最大值的函数.并且这个方法只能接受Number的子类并且实现了Comparable接口
  • 原文地址:https://www.cnblogs.com/xuxiuxiu/p/7080660.html
Copyright © 2011-2022 走看看