`
tangwenchao86
  • 浏览: 374193 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

一。Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:

表1事务传播行为类型

事务传播行为类型说明

1.PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

2.PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。

3.PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。

4.PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。

5.PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6.PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。

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

二。事务的隔离级别
1、序列化(Serializable):最严格的Spring事务隔离级别,事务串行执行,资源消耗最大; 除了防止脏读,不可重复读外,还避免了幻像读。


2、可重复读取(REPEATABLE READ):保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。


3、授权读取(READ COMMITTED):大多数主流数据库的默认Spring事务隔离等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。 另外一个事务不能读取该事务未提交的数据

4、未授权读取(Read Uncommitted):保证了读取过程中不会读取到非法数据。Spring事务隔离级别在于处理多事务的并发问题。这种隔离级别会产生脏读,不可重复读和幻像读。

  隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。



参考文章:

http://developer.51cto.com/art/200906/132336.htm
分享到:
评论

相关推荐

    SPRING事务传播特性&事务隔离级别

    事务传播特性&事务隔离级别 详细的事务传播特性&事务隔离级别

    事务的传播行为和隔离级别.docx

    事务的传播行为和隔离级别.docx

    spring常用数据库事务传播属性和事务隔离级别1

    事务的属性:1.Propagation:用来设置事务的传播行为事务的传播行为:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启了一个新

    Spring事务传播属性和隔离级别详细介绍

    主要介绍了Spring事务传播属性和隔离级别详细介绍,同时涉及传播行为介绍,超时设置等相关内容,需要的朋友可以参考下。

    Spring声明式数据库事务的使用-隔离级别

    上面我们只是简单的使用事务,这里将讨论Spring事务机制中最重要的两个配置项,即隔离级别与传播行为。毫无疑问本节内容是本章的核心内容,也是互联网企业最关注的内容之一,因此他十分重要,值得花费大的篇幅去讨论...

    Spring事务传播机制.docx

    【Spring五个事务隔离级别和七个事务传播行为】 数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来。 下面是我收集到一些...

    深入理解Spring声明式事务:源码分析与应用实践

    此外,Spring事务管理器支持多种类型的事务策略,包括不同的传播行为和隔离级别,允许开发者根据具体业务场景选择最合适的事务管理策略。深入理解Spring声明式事务的工作原理,不仅能帮助开发者更高效地使用Spring...

    Spring事务测试题及原理

    此ppt中前半部分通过spring事务的60道题的测试,摸底对事务的掌握情况,后半部分,对spring中的事务属性(传播行为、隔离级别、回滚规则、事务超时、是否只读)进行说明

    主题:详解spring事务属性.doc

    我们在使用Spring声明式事务时,有一个非常重要的概念就是事务...事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。

    编程语言+JAVAspring+事务管理+数据一致性

    它介绍了JAVAspring的事务管理的概念、原理和作用,以及如何使用JAVAspring的事务管理来保证数据的一致性,包括事务的属性、传播行为、隔离级别、回滚规则等内容,以及一些配置文件和注解的用法。

    尚硅谷佟刚Spring4代码及PPT.rar

    JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。

    资源竞争与并发控制

    非常浅显的讲述《资源竞争与并发控制》。 1.应用层并发控制?不是重点 2.Lost Update?乐观锁与悲观锁 3.隔离级别:脏读Dirty Read+幻读Phantom Read 4.InnoDB锁与多版本控制?...6.事务传播行为?

    动力节点老杜最新版Spring6框架教程学习资料分享

    第五点:代码演示事务传播行为 第六点:代码演示事务隔离级别 第七点:Bean的循环依赖 第八点:Spring的八大设计模式 第九点:17种注入方案,其他视频讲10种以内。 第十点:Bean的8种Scope,其他视频最多讲4种。 第...

    spring考试通过必备材料.docx

    事务的传播行为设置为REQUIRES NEW, 26 事务的隔离级别设置为DEFALIT 26 在applicationContext.xml中配置文件通知 27 JDBC 28 Text测试类 29 Hibernate.cfg.xml 31 AOP方法的通知 31 单独前置通知 31 单独后置通知 ...

    二十道面试题每个题你能讲个十分钟恭喜你在上海至少16k(Java中级开发)

    Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们的...

    Spring.html

    传播行为:A--&gt;B,在B上声明是否一定需要事务管理 requerd:必须的(默认),如果A有事务那么就加入A的事务,如果A没有事务那么单独创建一个事务 supports,如果A有事务则加入,如果没有就算了 隔离级别 default:...

    Spring.3.x企业应用开发实战(完整版).part2

    9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean 9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明...

    Spring3.x企业应用开发实战(完整版) part1

    9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean 9.5.3 基于tx/aop命名空间的配置 9.6 使用注解配置声明...

Global site tag (gtag.js) - Google Analytics