转载自:http://blog.chinaunix.net/u1/55983/showart_2091761.html
7个传播行为,4个隔离级别,

Spring事务的传播行为和隔离级别[transaction behavior and isolated level]2007-08-01 16:33事务的传播行为和隔离级别[transaction behavior and isolated level]

Spring中事务的定义:
一、Propagation :
  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

很多人看到事务的传播行为属性都不甚了解,我昨晚看了j2ee without
ejb的时候,看到这里也不了解,甚至重新翻起数据库系统的教材书,但是也没有找到对这个的分析。今天搜索,找到一篇极好的分析文章,虽然这篇文章是重点
分析PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRED_NESTED的
====================================================
  
 
 
 
解惑 spring 嵌套事务
/**
* @date 2006-11-24
* @note 转载自http://www.javaeye.com/topic/35907?page=1
*/
********TransactionDefinition 接口定义*******************
/**
      * Support a current transaction, create a new one if none exists.
      * Analogous to EJB transaction attribute of the same name.
      *
This is typically the default setting of a transaction definition.
      */
     int PROPAGATION_REQUIRED = 0;
  
     /**
      * Support a current transaction, execute non-transactionally if none exists.
      * Analogous to EJB transaction attribute of the same name.
      *

Note: For transaction managers with transaction synchronization,
      * PROPAGATION_SUPPORTS is slightly different from no transaction at all,
      * as it defines a transaction scopp that synchronization will apply for.
      * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc)
      * will be shared for the entire specified scope. Note that this depends on
      * the actual synchronization configuration of the transaction manager.
      * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization
      */
     int PROPAGATION_SUPPORTS = 1;
  
     /**
      * Support a current transaction, throw an exception if none exists.
      * Analogous to EJB transaction attribute of the same name.
      */
     int PROPAGATION_MANDATORY = 2;
  
     /**
      * Create a new transaction, suspend the current transaction if one exists.
      * Analogous to EJB transaction attribute of the same name.
      *

Note: Actual transaction suspension will not work on out-of-the-box
      * on all transaction managers. This in particular applies to JtaTransactionManager,
      * which requires the javax.transaction.TransactionManager to be
      * made available it to it (which is server-specific in standard J2EE).
      * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
      */
     int PROPAGATION_REQUIRES_NEW = 3;
  
     /**
      * Execute non-transactionally, suspend the current transaction if one exists.
      * Analogous to EJB transaction attribute of the same name.
      *

Note: Actual transaction suspension will not work on out-of-the-box
      * on all transaction managers. This in particular applies to JtaTransactionManager,
      * which requires the javax.transaction.TransactionManager to be
      * made available it to it (which is server-specific in standard J2EE).
      * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
      */
     int PROPAGATION_NOT_SUPPORTED = 4;
  
     /**
      * Execute non-transactionally, throw an exception if a transaction exists.
      * Analogous to EJB transaction attribute of the same name.
      */
     int PROPAGATION_NEVER = 5;
  
     /**
      * Execute within a nested transaction if a current transaction exists,
      * behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB.
      *

Note: Actual creation of a nested transaction will only work on specific
      * transaction managers. Out of the box, this only applies to the JDBC
      * DataSourceTransactionManager when working on a JDBC 3.0 driver.
      * Some JTA providers might support nested transactions as well.
      * @see org.springframework.jdbc.datasource.DataSourceTransactionManager
      */
     int PROPAGATION_NESTED = 6;

***************************************************************

二、Isolation Level(事务隔离等级)


1、Serializable:最严格的级别,事务串行执行,资源消耗最大;

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

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

4、Read Uncommitted:保证了读取过程中不会读取到非法数据。隔离级别在于处理多事务的并发问题。

我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。
这里就不阐述。

我们首先说并发中可能发生的3中不讨人喜欢的事情

1: Dirty reads--读脏数据。也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。

2: non-repeatable reads--数据不可重复读。比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。


3: phantom reads--幻象读数据,这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是non-repeatable reads的不一致是因为他所要取的数据集被改变了(比如total的数据),但是phantom reads所要读的数据的不一致却不是他所要读的数据集改变,

而是他的条件数据集改变。比如Select account.id where account.name="ppgogo*",第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由"dd"改成"ppgogo1",结果取出来了7个数据。

Dirty reads non-repeatable reads phantom reads
Serializable 不会 不会 不会

REPEATABLE READ 不会 不会 会

READ COMMITTED 不会 会 会

Read Uncommitted 会 会 会

三、readOnly
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。

  这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,

  例如在使用Object/Relational映射工具(如:Hibernate或TopLink)时避免dirty checking(试图“刷新”)。

四、Timeout

在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。

   在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释.

【转】详解spring事务属性的更多相关文章

  1. 详解spring事务属性

    Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try…catch…final ...

  2. 【Spring】详解spring事务属性

    Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try…catch…final ...

  3. 18个示例详解 Spring 事务传播机制(附测试源码)

    什么是事务传播机制 事务的传播机制,顾名思义就是多个事务方法之间调用,事务如何在这些方法之间传播. 举个例子,方法 A 是一个事务的方法,方法 A 执行的时候调用了方法 B,此时方法 B 有无事务以及 ...

  4. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  5. 【转】详解spring 每个jar的作用

    spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...

  6. 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

    用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是 ...

  7. 使用IDEA详解Spring中依赖注入的类型(上)

    使用IDEA详解Spring中依赖注入的类型(上) 在Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值)注入Bean组件 ...

  8. 详解Spring中Bean的作用域与生命周期

    摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...

  9. 详解android:scaleType属性

    详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262    http://juliaailse. ...

随机推荐

  1. <一道题>abc+cba=1333,求满足条件的abc的值,隐含条件a!=0,c!=0

    这类东西,无非就是穷举法.见下面代码: #include <stdio.h> #include <stdlib.h> /* *abc + cba = 1333 * *a = ? ...

  2. 使用UIGestureRecognizer监听屏幕事件

    转载自  http://blog.csdn.net/samguoyi/article/details/7911499 如果只是想获取屏幕点击事件有一个最简单的办法,就是写一个透明的uibutton覆盖 ...

  3. HDU 4870 Rating(高斯消元 )

    HDU 4870   Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP ...

  4. HDU 3853LOOPS(简单概率DP)

    HDU 3853    LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...

  5. How to create custom methods for use in spring security expression language annotations

    From:http://stackoverflow.com/questions/6632982/how-to-create-custom-methods-for-use-in-spring-secur ...

  6. PowerDesigner 12.5 反向工程sql server

    一.设置数据源 1.控制面板 >> 数据源(ODBC)

  7. reactor设计模式

    reactor介绍 reactor的工作模式就像它的名字一样,是一种反射模式,当事件发生时,根据发生的事件调用注册的处理器. Reactor的优点和应用 Reactor最常用于非阻塞的socket 传 ...

  8. PHP发送邮件。

    第三方类库: ①.email.class.php. ②.phpmailer:https://github.com/PHPMailer/PHPMailer. PHPMailer发送邮件”SMTP 错误: ...

  9. 不需要JAVAScript完成分页查询功能

    分页查询之前已经说过,现在用另一种方法实现,换汤不换药.但是更简单. view层代码: 控制层代码: 业务逻辑层,主要看一下方法count1()的代码: count1()方法的功能就是控制翻页,如果传 ...

  10. js 原型的内存分析

    使用构造器的弊端:http://www.cnblogs.com/a757956132/p/5258897.html 示例 将行为设置为全局的行为,如果将所有的方法都设计为全局函数的时候, 这个函数就可 ...