`
lym6520
  • 浏览: 704018 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

认识spring事务

阅读更多
    ps:这篇文章几个月前就整理好了,参考了很多好文章,吸取了他们的精华+自己的一些理解,分享给je的朋友们!

    Spring框架引人注目的重要因素之一是它全面的事务支持。Spring框架提供了一致的事务管理抽象,这带来了以下好处:
•为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO
•支持 声明式事务管理
•提供比大多数复杂的事务API(诸如JTA)更简单的,更易于使用的 编程式 事务管理API
•非常好地整合Spring的各种数据访问抽象

首先看下一个简单的应用配置:
    声明式事务配置:
<!-- 配置事务管理器 --> 
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
    
    <!-- 配置事务特性 -->       
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>
      <tx:method name="add*" propagation="REQUIRED"/>
      <tx:method name="insert" propagation="REQUIRED"/>
      <tx:method name="save" propagation="REQUIRED"/>
      <tx:method name="modify*" propagation="REQUIRED"/>
      <tx:method name="delete*" propagation="REQUIRED"/>
     
      <tx:method name="*" read-only="true" propagation="NEVER"/>
     </tx:attributes>
    </tx:advice>
    
    <!-- 配置那些类的方法进行事务管理 -->
    <aop:config proxy-target-class="true">
     <aop:pointcut id="allManagerMethod" expression="execution (* org.lxh.ssh.PersonDAOImpl.*(..))"/>
     <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config> 



    采用spring注释配置:
<!-- 事务管理 "org.springframework.jdbc.datasource.DataSourceTransactionManager"-->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref = "sessionFactory "></property>
	</bean>
	<!-- 将所有具有@Transactional注解的Bean自动配置为声明式事务支持 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>




    已上配置只是基于单数据源的配置,如果一个事务包含了两个数据源的操作,这样的事务就不能正常运行,对应多事务源的程序里,还是需要老老实实使用用分布式事务管理服务(jta)。
注:如果只用Tomcat做应用服务器的话是不能使用JTA事务的

    通过采用spring注释配置,我们可以使用@Transactional注解来进行事务的处理,@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。 然而,请注意只是使用 @Transactional 注解并不会启用事务行为, 它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 <tx:annotation-driven/>元素的出现 开启 了事务行为。
    @Transactional 注解是用来指定接口、类或方法必须拥有事务语义的元数据。 如:“当一个方法开始调用时就开启一个新的只读事务,并停止掉任何现存的事务”。 默认的 @Transactional 设置如下:
•事务传播设置是 PROPAGATION_REQUIRED
•事务隔离级别是 ISOLATION_DEFAULT
•事务是 读/写
•事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
•任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚

spring事务都有哪一些传播特性:
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

Spring事务的隔离级别:
  1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。
  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
  3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取
该事务未提交的数据
  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
  5. ISOLATION_SERIALIZABLE: 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。


了解脏数据,脏读,不可重复读,幻觉读:
   脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
    
   不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
            
   幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

    通过以上对事物的简单了解,我们知道在service这一层处理事务,覆盖的范围就很广了,但是实际上,并不是每个操作都能回滚的,只有那些有事务性的操作可以回滚。最简单的说,在事务中,发了email,修改了硬盘文件,那么这些操作都是不可以回滚的。而即使是修改数据库的操作,如果数据库不支持事务或者由于代码写得不支持事务,这部分的代码也是不能回滚的,那么也不会回滚。这个看起来有点废话,想说明的只是,事务不是什么神奇的东西,不要误会一回滚,什么东西都回复原来的现状了。包括工作流那些东东,不要以为是理所当然的,要记住,只有支持事务的操作,才是可以回滚的。所以,事务并不是万能的,并不是有了事务在出现异常的情况下,什么操作都可以恢复到本来的面貌。

3
1
分享到:
评论

相关推荐

    Spring事务传播机制.docx

    在了解嵌套事务之前,可以先看下单个事务在 Spring 中的处理流程,以便后面可以更清晰地认识嵌套事务的逻辑。Spring 事务使用 AOP 的机制实现,会在@Transactional 注解修饰的方法前后分别织入开启事务的逻辑,以及...

    springboot整合spring事务

    通过以上内容,你应该已经对Spring Boot整合Spring事务有了全面的认识。在实际项目中,合理利用Spring的事务管理,能有效地保证业务逻辑的正确执行,防止数据不一致问题。在设计和编写代码时,务必考虑到事务的边界...

    零基础认识 Spring Boot.docx

    零基础认识 Spring Boot Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的开发过程。它提供了一种快速、灵活和高效的方式来构建生产级应用程序。 新建 Spring Boot 项目 使用 Spring ...

    struts2.2.3+spring2.5+hibernate3.2事务

    Struts2.2.3、Spring2.5...这涉及到对数据库事务的理解,如ACID(原子性、一致性、隔离性、持久性)属性,以及对Spring事务管理机制的深入认识。在实际项目中,合理运用事务管理可以大大提高系统的稳定性和数据安全性。

    spring2.0技术手册 (扫描版)

    第1章认识Spring 第2章Spring入门 第3章Bean、消息、事件 第4章SpringAOP 第5章JDBC、事务支持 第6章Hibernate与Spring 第7章SpringWebMVC框架 第8章View层方案、Web框架整合 第9章API封装 第10章项目:...

    Spring+3.x企业应用开发实战光盘源码(全)

     第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。  第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生...

    spring技术手册demo

    通过这五个章节的学习,你将对Spring有一个全面的认识,能够熟练地使用Spring框架进行开发,无论是基本的Bean管理,还是更高级的AOP和数据库操作,甚至是集成ORM框架。这些知识将为你的软件开发事业打下坚实的基础。

    spring技术内幕(第2版)

    在书中会深入讲解如何使用Spring的JdbcTemplate简化数据库操作,如何集成Hibernate、MyBatis等ORM框架,并且对Spring事务管理与数据访问的整合进行详细分析。 Spring MVC是构建Web应用程序的模型-视图-控制器(MVC...

    spring框架简单教程

    通过本教程,你应该对Spring框架有了初步的认识,了解了其核心的IoC和DI机制。接下来,你可以深入学习Spring的其他模块,如数据访问、事务管理、AOP等,以提升你的Java开发技能。记住,掌握Spring不仅可以提高开发...

    spring src

    本篇文章将深入探讨Spring 2.0.6版本的源代码,帮助读者理解其核心机制,提升对Spring框架的深入认识。 Spring的核心在于控制反转(IoC)和面向切面编程(AOP)。IoC通过反转对象的创建和管理权,使开发者可以专注...

    spring源码合集spring源码合集

    本合集深入剖析了Spring的诸多关键特性,包括依赖注入、配置类解析、Bean生命周期管理、以及与MyBatis的整合等,旨在帮助读者构建起对Spring全面而深入的认识。 1. **依赖注入源码解析**:在"06-Spring之依赖注入...

    跟我学spring3pdf,高清

    《跟我学Spring3》是一本深入浅出的Spring框架学习指南,...通过阅读这两部分PDF(跟我学spring3(8-13).pdf和跟我学spring3(1-7).pdf),你将能够逐步构建起对Spring框架的全面认识,从而在Java开发领域更上一层楼。

    Spring AOP完整例子

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,通过...这个例子提供了学习Spring AOP实际操作的宝贵资源,通过阅读源码和运行测试,你将对Spring AOP有更全面的认识。

    Spring AOP框架实现的结构分析

    最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是从外部接口、内部实现、组成部分、执行过程四个方面来认识 SpringAOP 框架。本文的风格是首先列出 AOP 的基本概念,然后介绍框架所涉及到的核心...

    Spring基础包

    通过学习这些,初学者能够建立起对Spring的基本认识,并具备使用Spring开发实际项目的能力。在实践中,还需要不断探索Spring的高级特性,如Spring Cloud对于分布式系统的支持,以及Spring Data对各种数据存储的抽象...

    spring2.0技术手册

    Spring是一个开源的Java平台,它最初是为了解决企业应用开发的复杂性而设计的,提供了一系列的解决方案,包括了对数据访问、事务管理、安全性、远程访问和消息传递的支持。Spring 2.0作为该框架的一个重要版本,引入...

    spring思维导图.zip

    通过学习以上知识点,并结合提供的"spring思维导图",读者可以更好地构建对Spring的整体认识,理解其设计理念,提升在实际项目中的应用能力。在实践中不断探索,Spring的奥秘会逐步揭示,成为你开发路上的强大助手。

    Spring技术内幕:深入解析Spring架构与设计原理

    本书可能会深入讲解Spring事务管理的工作原理和最佳实践。 除了上述核心概念之外,Spring还涉及了众多模块如Spring MVC用于构建Web应用程序,Spring Data简化数据访问层开发,Spring Boot简化Spring应用的配置和...

    Spring面试题总结.pdf

    标题为"Spring面试题总结"的文档是一份专门针对程序员在应聘与Spring相关职位时可能会遇到的技术面试题的整理和总结。...在面试准备时,这些知识点的深入理解有助于展现应聘者对Spring框架全面而深刻的认识。

Global site tag (gtag.js) - Google Analytics