spring 事务属性

本文介绍spring事务的5个属性

  spring中,声明事务是通过事务属性来定义的。事务属性描述了事务策略如何应用到方法上事务属性包含5个方面:

  • 传播行为
  • 隔离级别
  • 回滚规则
  • 事务超时
  • 是否只读

  传播行为

  传播行为定义了客户端与被调用方法之间的事务边界,即传播规则回答了这样的一个问题,新的事务应该被启动还是挂起,或者方法是否要在事务环境中运行。7中传播规则:

  1. PROPAGATION_MANDATORY(强制传播):表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
  2. PROPAGATION_NESTED(嵌套传播):表示如果当前存在一个事务,那么该方法就回在嵌套事务中运行,嵌套的事务可以独立于当前事务进行单独地提交或回滚,如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样
  3. PROPAGATION_NEVER:(从不传播):表示当前方法不应该运行在事务上下文中,如果档期正有一个事务在运行,则会抛出异常
  4. PROPAGATION_NOT_SUPPORED(不支持传播):表示该方法不应该运行在事务中,如果存在当前事务,在该方法运行期间,当前事务将会被挂起
  5. PROPAGATION_REQUIRED(必要传播):表示当前事务必须运行在事务中,如果当前事务存在,方法将会在该事务中运行,否则,会启动一个新的事务
  6. PROPAGATION_REQUIRED_NEW(新建必要传播):表示当前方法必须运行在自己的事务当中(运行在一个新建的事务当中),如果当前存在事务,当前事务挂起 
  7. PROPAGATION_SUPPORT(支持事务):表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么盖房会在这个事务中运行

  隔离界别

  隔离级别定义了一个事务可能受其他并发事务影响的程度。

  多个并发事务可能会导致一下问题:

  1. 脏读---脏读发生在一个事务独缺了冰一个事务改写但尚未提交的数据时,如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
  2. 不可重复读---不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时,这通常是因为另一个并发事务在两次查询期间更新了数据。
  3. 幻读---幻读发生在一个事务读取了几行数据,接着另外一个事务插入了一些数据,在随后的查询中,第一格式就回发现多了一些原本不存在的记录。

  隔离规则:

  1. ISOLATION_DEFAULT:使用后端数据库默认的规则
  2. ISOLATION_READ_UNCOMMITTED:允许读取尚未提交的数据变更,可能会导致脏读,幻读或不可重复读
  3. ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以防止脏读,但是幻读或不可重复读仍有可能发生
  4. ISOLATION_REPEATABLE_READ:对同意字段的多次读取结果是一致的,除非数据是被本事务自己所修改,看阻止脏读和不可重复读,但幻读仍有可能发生
  5. ISOLATIOM_SERIALIZABLE:完全服从ACID的隔离级别,确保阻止脏读,不可重复读以及幻读,这是最慢的数据隔离级别

  是否只读

  如果事务只对后端的数据库进行读操作,数据库可以利用事务ID只读特性来进行一些特定的优化。通过将事务设置为只读,你就可以给数据库一个机会,让他应用它认为合适的优化措施。因为是否只读是在事务启动的时候由数据库实施的,所以只有对那些具备可能启动一个新事务的传播行为(PROPAGATION_REQUIRED,PROPAGATION_REQUIRED_NEW,PROPAGATION_NESTED)的方法来说,才有意义。

  事务超时

  为了使应用程序很好地运行,事务不能运行太长时间。因为超时时钟会在事务开始时启动,所以只有对那些具备可能启动一个新事务的传播行为(PROPAGATION_REQUIRED,PROPAGATION_REQUIRED_NEW,PROPAGATION_NESTED)的方法来说,才有意义。

  

  事务回滚

  事务回滚规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有在遇到运行时期异常才回滚,而在遇到检查型异常时不会回滚。

具体看下XML配置

<tx:annotation-driven />
<tx:advice id="txAdvice" transactionmanager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
</tx:advice>
<aop:config expose-proxy="true" proxy-target-class="true">
        <!-- 只对业务逻辑层实施事务 -->
        <aop:pointcut id="txPointcut" expression="execution(* com.weiaigongdi.access..service..*+.*(..))"/>
        <aop:advisor id="txAdvisor" advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="ds1" />
</bean> 
时间: 2024-10-12 12:44:42

spring 事务属性的相关文章

详解spring事务属性

先了解一下数据库并发操作带来的数据不一致性包括三类:丢失修改,不可重复读(第二个事务修改,或插入,或删除,应该说幻读是指插入或删除的情况),脏读. T1 T2 T1 T2 T1 T2 ①读A=16   ①读A=50 读B=150 求和150   ①读C=100 C=C*2 写回C   ② 读A=16 ② 读B=100 B=B*2 写回B=200 ② 读C=200             ③A=A-1 写回A=15   ③读A=50 读B=200 求和250   ③ROLLBACk C恢复到100

Spring学习笔记(四)-- Spring事务全面分析

通过本系列的文章对Spring的介绍,我们对Spring的使用和两个核心功能IOC.AOP已经有了初步的了解,结合我个人工作的情况,由于项目是金融系 统,那对事务的控制是必不可少的,并且是非常严格的控制.根据我对项目的研究,它在管理模块用的是JTA的事务,而在交易模块用的是JDBC的事 务,但是,所有的这些事务的使用,都是用Spring封装后的编程式事务.我在看完<Spring In Action>后,在网上看了下大家对Spring事务的理解,貌 似都没有真正的文章是去全面剖析Spring对这

spring事务管理——编程式事务、声明式事务

本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带有 512MB 内存(

Spring事务控制和回滚

1在一个项目中ssh结构,spring2.5,事务控制采用的是tx拦截器的方式. 自己写了个 int a=1/0;异常抛出了,但是事务还是提交了,怎么搞都不行. 现将看到的一些事务控制总结下来: 事务控制默认回滚RuntimeException(数组越界,结果为0等),并且是notchecked异常. 注意:sql内部出现异常默认不会回滚 如果在Service中有 try ..catch的形式,则无法抛出异常,不会回滚.因此需要在catch中throw new runtimeException在

Spring 事务传播特性

Spring 事务属性一共有四种:传播行为.隔离级别.只读和事务超时 a)   传播行为定义了被调用方法的事务边界. 传播行为 意义 PROPERGATION_MANDATORY 表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常 PROPAGATION_NESTED 表示如果当前事务存在,则方法应该运行在一个嵌套事务中.否则,它看起来和PROPAGATION_REQUIRED 看起来没什么俩样 PROPAGATION_NEVER 表示方法不能运行在一个事务中,否则抛出异常 PROPA

Spring事务管理全面分析

Spring 事务属性分析什么是事物  事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保证用户和银行的利益都不受损失.   简单来说:事物指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败.在 Spring 中,事务是通过 Tran

spring事务传播属性与隔离级别

一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行.PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常.PROPAGATION_R

Spring的事务属性

1.事务Transactional下的属性 @Transactional( readOnly = false, // 读写事务,只读事务 timeout = -1, // 事务的超时时间不限制 //noRollbackFor = ArithmeticException.class, // 不回滚 = 条件.class isolation = Isolation.DEFAULT, // 事务的隔离级别,数据库的默认 propagation = Propagation.REQUIRED // 事务的

Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪