`
toprogrammer
  • 浏览: 65118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring:事务管理

阅读更多
来源:http://www.360doc.com/content/10/0906/22/3183606_51725538.shtml


Spring不会直接去管理事务,它提供了很多可供选择的事务管理器,将事务委托给JTA或某些特定的平台事务实现。常见的Spring事务管理器:
       
        org.springframework.jdbc.datasource.DataSourceTransactionManager
      提供JDBC事务支持,也可以用来支持iBatis
        org.springframework.orm.hibernate.HibernateTransactionManager
      Hibernate2持久事务支持
        org.springframework.orm.hibernate.HibernateTransactionManager
      Hibernate3持久事务支持
        org.springframework.orm.jpa.JpaTransactionManager JPA持久事务支持

       这些都是一些持久性事务,也是平时用的最多的(尤其是对我这种天天CRUD的人)

      OK!知道了这一点我们便可以在Spring中编写事务,最常用的方法是使用TransactionTemplate,如果你用过Spring的JdbcTemplate的话就会觉的它跟这个用法很像。
      首先我们需要声明一个Spring的事务管理器。我们知道,使用JdbcTemplate需要一个数据源,使用事务那么也需要一个声明一个事务管理器:
                 

      <bean id="transactionManager"
      class="org.springframework.jdbc.datasoure.DataSoureTransactionManager">
         <property name="dataSource" ref="dataSource"/>
      </bean>

      这是JDBC的事务管理器,它有一个dataSource属性,指向要操作的数据源.接下来我们要写一个用户注册的服务(我实在举不出什么好例子来了):

      public class UserService {
         
          @Autowired
          private TransactionTemplate transactionTemplate;
         
              @Autowired
          private UserDAO userDAO; 
         
              @Autowired
          private MailSender sender;
         
          public UserService(){
             
          }

          public void reg(final User user){
              transactionTemplate.execute(new TransactionCallback(){
                  public Object doInTransaction(TransactionStatus ts){
                      try{
                          userDAO.insert(user);
                          sender.send();
                      }
                      catch(Exception e){
                          ts.setRollbackOnly();
                      }
                     
                      return null;
                  }
              });
          }
      }

      注册服务分为两个步骤,一个是将用户的信息插入到数据库,二是向用户发送邮件激活通知。这两个步骤是原子性的(好吧),因此需要使用事务支持,事务操作主要是通过

      TransactionTemplate来实现的,我们需要在Spring配置文件中配置它:
      <bean id="transactionTemplate"
      class="org.springframework.transaction.support.TransactionTemplate">
          <property name="transactionManager" ref="transactionManager"/>
      </bean>
      属性transactionManager指向前面声明的JDBC事务管理器
      我们只需要将事务代码放入到doInTransaction方法中即可,如果doIntransaction能够被成功执行到return,则事务将被提交,如果中途遇到问题,如Exception,则调用

      setRollbackOnly()方法回滚整个事务

      Spring对声明式事务的支持:
      嗯~~上面这段代码不是很好,为啥?因为reg服务应该只去管用户注册这个事情,但是它现在却包含了很多事务处理的代码,违反了单一原则,这时候你可能会想到AOP,能不

      能使用AOP来处理事务呢?嗯,开发Spring的大牛们当然会去想到这一点,他们为此提供了声明式事务的支持,这个支持也是通过Spring的AOP框架来实现的。

      什么是声明式事务?就是通过配置文件和注解等方式来进行事务的声明,而不去侵犯程序代码,这样就不会违背单一职责原则了。

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

      关于脏读(Dirty read)、不可重复读(Nonrepeatable read)和幻读(Phantom reads)的介绍:
      脏读:如果事务A读取了事务B改写但是尚未提交的数据,事务B发生了问题(来了大姨妈?)回滚了,那么A所读取的数据是无效的,这个故事叫做脏读
      不可重复读:如果一个事务多次读取数据,每一次结果都不同,这是由于另一个事务在更改数据,这个故事叫做不可重复读
      幻读:幻读跟不可重复读差不多,如果一个事务A读取了数据,事务B又插入了一些数据,在后来的查询中事务A发现了一些额外的记录

      很简单?哈哈.看看在Spring中如何使用声明式事务:
      Spring2.0开始为事务提供了配置元素
      首先需要在Spring配置文件中添加AOP支持,因为Spring声明式事务是基于AOP的,然后在加入事务标签支持:
      命名空间:
       xmlns:tx="http://www.springframework.org/schema/tx"
      Schema声明:
       http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-2.0.xsd

      接下来我们只需要添加如下配置内容就可以使用声明式事务了:
      <!- 这个就不详细说了,添加AOP支持  -->
      <aop:config>
         <aop:pointcut  expression="execution(* *. .UserServicce.reg(..)"/>
         <aop:advisor  advice-ref="txAdvice"/>
      </aop:config>
      <!-- 重点是下面 -->
      <tx:advice id="txAdvice" transaction-manager="transactionManager">
         <tx:attributes>
          <tx:method name="reg" propagation="REQUIRED"/>
         </tx:attributes>
      </tx:advice>

      <tx:advice>用来声明事务策略,同样需要指定一个事务管理器,这个是必须的,我们知道Spring不会自己去管理事务的,它一向喜欢代理,让人看起来好像一切都是它的功

      劳,嗯!

      <tx:attribute>声明了事务参数,<tx:method>是需要提供事务支持的方法,需要注意的是它有这么几个参数:
      isolation:指定事务隔离级别
      no-rollback-for:对于哪些异常不回滚(设计者咋就想的这么周到呢!?)
      propagation:事务的传播级别
      read-only:该事务只读
      rollback-for:哪些异常发生之后回滚
      timeout:定义事务超时

      唉~~配置文件还是太恶心了,要是有注解~~嗯,还真有:
      首先要添加一个注解驱动标签:<tx:annotation-driven transaction-manager="txManager"/>
      然后我们使用@Transactional注解,这个注解可以修饰类也可以修饰方法,修饰类的话将作用于该类所有的方法,注解的参数同<tx:method>的参数,另外有一个很酷的地方

      是如果UserService是一个接口,那么我给他使用了@Transactional()注解,那么它的一系列实现类UserServiceImpl1、UserServiceImpl2……UserServiceImpl10000都会自

      动支持该声明事务

      完!事务很重要!
分享到:
评论

相关推荐

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。

    实验 spring 声明事务

    实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...

    基于java的企业级应用开发:Spring事务管理概述.ppt

    PlatformTransactionManager接口是Spring事务管理的核心,它负责事务的创建、提交和回滚。这个接口定义了以下三个基本操作: - `getTransaction(TransactionDefinition definition)`:根据传入的...

    spring3.0两种事务管理配置

    Spring 3.0 提供了两种事务管理配置方法:基于 XML 的事务管理和基于 @Transactional 的事务管理,这两种方法都是为了实现事务管理的目标,分别具有不同的配置方式和优缺点。 基于 XML 的事务管理 这种方法不需要...

    Spring的事务管理小案例

    在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供...如果你想要深入了解,可以参考提供的博客链接或其他相关资料,进一步学习Spring事务管理的细节和最佳实践。

    spring事务管理5种方法

    本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    深入理解spring的事务管理机制

    Spring事务管理的核心是基于AOP(面向切面编程)来实现的。 **Spring事务的本质**实际上是依赖于底层数据库提供的事务支持。如果没有数据库层面的支持,Spring无法单独实现事务的功能。在传统的JDBC操作中,如果想...

    spring 注解事务管理

    Spring事务管理主要分为两种方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编写代码来控制事务的开始、提交、回滚等操作,而声明式事务管理则是通过配置或注解来定义事务边界,更加直观和易于使用。 ...

    spring_事务管理(实例代码)

    Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...

    spring hibernate 事务管理学习笔记(一)

    在实际开发中,理解这部分源码有助于我们更深入地掌握Spring事务管理的工作原理。 至于工具,开发者可以使用诸如IntelliJ IDEA这样的IDE,其中集成的调试工具可以帮助我们跟踪代码执行流程,查看事务状态的变化,...

    spring 事务管理的理解

    Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。

    spring JDBC事务管理

    标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...

    spring_如何管理事务的

    #### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...

    Spring2.5实现事务管理(本地事务、分布式事务).doc

    Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个...

    Spring 框架的事务管理及应用

    ### Spring框架的事务管理及应用 #### Spring框架概述 Spring框架是一个开源项目,最早出现在2003年2月,其起源可以追溯到Rod Johnson在2002年末出版的书籍《Expert One-on-One J2EE Design and Development》中的...

    spring事务管理

    ### Spring事务管理详解 #### 一、事务管理基础概念 在深入探讨Spring事务管理之前,我们需要先理解什么是事务。事务可以被定义为一系列的操作集合,这些操作作为一个整体被提交或回滚。简单来说,事务就是一个不...

    spring事务与数据库操作

    Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中声明式事务管理因其易于使用和维护而被广泛采用。 ##### 1.1 Spring声明式事务介绍 Spring的声明式事务管理是通过配置文件或注解的方式来实现...

Global site tag (gtag.js) - Google Analytics