`

Spring学习笔记(三)-事务

阅读更多

 

事务管理

仅用四个词解释事务

 

atomic(原子性):要么都发生,要么都不发生。

consistent(一致性):数据应该不被破坏。

Isolate(隔离性):用户间操作不相混淆

Durable(持久性):永久保存,例如保存到数据库中等


 

Spring提供了两种事务管理方式:

  • 编程序事务管理
  • 声明式事务管理

 

 

编程序事务管理

编写程序式的事务管理可以清楚的定义事务的边界,可以实现细粒度的事务控制,比如可以通过程序代码来控制你的事务何时开始,何时结束等,与下面的声明式事务管理相比,它可以实现细粒度的事务控制。

 

 

声明式事务管理

如果并不需要细粒度的事务控制,可以使用声明式事务,在Spring中,只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合,这是对应用代码影响最小的选择,从这一点再次验证了Spring关于AOP的概念。当不需要事务管理的时候,可以直接从Spring配置文件中移除该设置.需要引入用于事务管理的命名空间(tx).

Spring并没有直接管理事务,而是将事务的管理委托给其他的事务管理器实现.

Spring支持的事务管理器:

 

  • org.springframework.jdbc.datasource.DataSourceTransactionManager (在单一的JDBC Datasource中的管理事务)
  • org.springframework.orm.hibernate3.HibernateTransactionManager (当持久化机制是hibernate时,用它来管理事务)
  • org.springframework.jdo.JdoTransactionManager (当持久化机制是Jdo时,用它来管理事务)
  • org.springframework.transaction.jta.JtaTransactionManager (使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用)
  • org.springframework.orm.ojb.PersistenceBrokerTransactionManager (当apache的ojb用作持久化机制时,用它来管理事务)

基于XML文件配置事务管理器:

<!--1 配置数据源-->
<bean id="dateSource" class="org.apache.commons.dbcp.BasicDataSource">
   <property name="username" value="root"/>
   <property name="password" value="root"/>
   <property name="url" value="jdbc:mysql://localhost:3306/test"/>
   <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
   <property name="maxActive" value="100"/>
    <!-- 初始化连接数 -->
   <property name="initialSize" value="5"/>
  
   <!--最大空闲数,当洪峰退去时, 连接池所放的最少连接数-->
   <property name="maxIdle" value="8"/>
   
   <!--最小空闲数,当洪峰到来时,引起的性能开销 -->
   <property name="minIdle" value="5"/>
</bean>
  
<!--2 配置JdbcTemplate模板,类似于dbutils,可数据访问操作-->  
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 给JdbcTemplate注入数据源,调用JdbcAccessor中的setDataSource(DataSource dataSource)注入数据源-->
    <property name="dataSource" ref="dateSource"/>
</bean>  
 
 
<!-- 3 声明事务管理器(实际上,事务管理器就是一个切面),事务管理器将在获取连接时,返回一个打开事务的连接 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 注入数据源,spring的jdbc事务管理器在管理事务时,依赖于JDBC的事务管理机制 -->
    <property name="dataSource" ref="dateSource"/>
</bean>
 
<!-- 4 配置通知 
     id="advice":该属性的值就是通知的唯一标识
     transaction-manager:表示通知织入哪个切面
-->
<tx:advice id="advice" transaction-manager="txManager">
  <tx:attributes>
    <!-- tx:method的属性:
          * name 是必须的,表示与事务属性关联的方法名(业务方法名),对切入点进行细化。通配符(*)可以用来指定一批关联到相同的事务属性的方法。
                    如:'get*''handle*''on*Event'等等.
          * propagation  不是必须的 ,默认值是REQUIRED 
                            表示事务传播行为, 包括REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED
          * isolation    不是必须的 默认值DEFAULT 
                            表示事务隔离级别(数据库的隔离级别) 
          * timeout      不是必须的 默认值-1(永不超时)
                            表示事务超时的时间(以秒为单位) 
          
          * read-only    不是必须的 默认值false不是只读的 
                            表示事务是否只读? 
          
          * rollback-for 不是必须的   
                            表示将被触发进行回滚的 Exception(s);以逗号分开。
                            如:'com.foo.MyBusinessException,ServletException' 
          
          * no-rollback-for 不是必须的  
                              表示不被触发进行回滚的 Exception(s);以逗号分开。
                              如:'com.foo.MyBusinessException,ServletException'
                              
                              
        任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚                      
     -->
     <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
     <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
     <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
     <!-- 其他的方法之只读的 -->
     <tx:method name="*" read-only="true"/>
  </tx:attributes>
</tx:advice>
 
<!-- 5 配置切入点 -->
<aop:config>
  
  <!-- 定义切入点,可以定义到类中所有的方法,之后在事务中在对方法进行细化 -->
  <aop:pointcut id="perform" expression="execution(* *.*(..))"/>
  
  <!-- 将通知和切入点关联起来-->
  <aop:advisor advice-ref="advice" pointcut-ref="perform"/>
</aop:config> 

配置完事务管理器后,再常规的配置Bean注入对象.默认只有运行时异常才将导致事务回滚.

基于注解配置事务管理器:

XML配置文件中只需要声明事务管理器,而不需要给它"灵魂",因为"灵魂"是由注解注入,所以需要注解解析器的支持:

<tx:annotation-driven transaction-manager="txManager"/>

注册对事务注解进行解析的处理器,将注解与事务管理器关联起来即可.

/**
 *   方法的事务设置将被优先执行。
 *   例如: BusinessService类在类的级别上被注解为只读事务,
 *   但是,这个类中的 save 方法的@Transactional 注解的事
 *   务设置将优先于类级别注解的事务设置。
 *   默认的 @Transactional 设置如下:
 *       事务传播设置是 PROPAGATION_REQUIRED
 *       事务隔离级别是 ISOLATION_DEFAULT
 *       事务是 读/写
 *       事务超时默认是依赖于事务系统的,或者事务超时没有被支持
 *       任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
 */
@Transactional(readOnly=true)
public class BusinessService {
    
    @Resource(name="personDao")
    private PersonDao personDao;
    
    @Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
    public void save() throws Exception{
        personDao.save();
        
        this.update();
    }
    
    public void update() throws Exception{
        personDao.save();
        
        personDao.update();
    }
} 

 


 

小记:三大框架中最难的当属三大框架的整合,本文只是简单的将Spring的一些常见配置记下,诸如SpringMVC也不错,和StrutsMVC只是封装的不一样.Spring强大的声明式事务管理,常被用以业务层的封装.

更多信息请查看 java进阶网 http://www.javady.com

分享到:
评论

相关推荐

    Spring学习笔记+学习源码.zip

    这份"Spring学习笔记+学习源码.zip"资源包含了深入学习Spring及其相关技术的知识点,以及实践代码,对提升Spring技能将大有裨益。 首先,我们来详细讨论Spring框架的主要组件和功能: 1. **依赖注入(Dependency ...

    Spring2.5.6学习笔记-最新

    以上是 Spring 2.5.6 学习笔记中的关键知识点,通过这些基础知识的学习,开发者可以开始构建基于 Spring 框架的应用程序。接下来,可以进一步深入学习 Spring 的高级特性,如事务管理、安全性、Web 开发等方面的知识...

    Spring学习笔记之九--声明式事务

    本篇文章将深入探讨Spring框架的一个关键特性——声明式事务管理。通过声明式事务,开发者可以避免手动处理事务的繁琐工作,提高代码的可读性和可维护性。 首先,我们了解什么是事务。在数据库操作中,事务是一系列...

    Spring学习笔记-cqupt

    在本篇 Spring 学习笔记中,我们将探讨 Spring 的入门、优点、组成以及重要的IOC理论。 1. **Spring 简介** Spring 是一个开源的、免费的 Java 框架,它的目标是减少企业级开发的复杂性。它集成了许多现有的技术,...

    Spring.NET学习笔记 - 刘冬.NET - 博客园

    这个压缩包包含了一系列刘冬.NET在博客园上发布的Spring.NET学习笔记,帮助读者深入理解这个强大的框架。 1. **控制反转(IoC)**: 控制反转是Spring.NET的核心概念之一,它将对象的创建和管理权交给了框架,而...

    Spring学习笔记(精华全记录)

    ### Spring学习笔记(精华全记录) #### Spring框架概述 Spring框架源自Rod Johnson的个人项目,最初于2002年末发布。Spring并非一开始就作为一个完整的框架出现,而是从一个项目逐步发展而来。随着项目的成熟,...

    Spring学习笔记(18)----使用Spring配置文件实现事务管理

    这篇"Spring学习笔记(18)----使用Spring配置文件实现事务管理"着重讲解如何通过Spring的XML配置来管理应用中的事务。这里我们将深入探讨相关知识点。 首先,Spring提供了两种事务管理方式:编程式事务管理和声明式...

    spring学习笔记

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...

    JSF2整合Spring3------JSF学习笔记4

    **JSF2整合Spring3——JSF学习笔记4** 在Java服务器端开发中,JavaServer Faces(JSF)和Spring框架都是重要的技术。JSF是一个用于构建用户界面的MVC(Model-View-Controller)框架,而Spring则是一个全面的企业级...

    spring学习笔记(十六)-声明式事务的例子

    在本篇“spring学习笔记(十六)-声明式事务的例子”中,我们将深入探讨这一主题。 首先,声明式事务管理基于AOP(面向切面编程)实现,Spring通过代理模式在方法调用前后自动插入事务管理的代码。它主要通过两种方式...

    Spring学习笔记(17)----使用Spring注解方式管理事务

    在本篇Spring学习笔记中,我们将探讨如何使用Spring框架的注解方式来管理事务,这是一种在现代Java应用中广泛采用的方法。Spring框架以其强大的依赖注入和面向切面编程能力,为事务管理提供了简洁且高效的解决方案。...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    这个文档集合包括了Spring的API参考、用户指南、开发者笔记等,是学习和使用Spring 2.5 RC2的宝贵资源。 首先,让我们了解一下Spring的核心特性。2.5版本引入了一些重要的增强,如依赖注入(Dependency Injection,...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    Spring学习笔记.zip

    根据提供的压缩包文件名,我们可以推测这是一个逐步学习Spring的系列笔记。从"Spring_day1"开始,可能涵盖了Spring的基础概念、环境搭建和基本配置。"Spring_day2"可能涉及了依赖注入和AOP的深入讲解。"Spring_day3...

    Spring Boot核心技术-笔记-pdf版.zip

    本资料为《Spring Boot核心技术-笔记-pdf版.zip》,包含了对Spring Boot核心概念的详细解读,是学习和掌握Spring Boot不可或缺的学习资源。 在Spring Boot的核心技术中,主要涉及以下几个关键点: 1. **起步依赖...

    Spring框架学习笔记

    这份"Spring框架学习笔记"涵盖了Spring框架的基础知识、核心组件以及高级特性,对于初学者来说是一份宝贵的资料。 一、Spring框架概述 Spring框架是为了解决企业应用开发的复杂性而设计的,它提供了一个全面的基础...

    SSH学习笔记--整理.rar

    最后,“Spring学习笔记(马士兵spring视频笔记).doc”涵盖了Spring框架的关键内容。Spring是一个全面的企业级应用框架,提供了依赖注入(DI)、面向切面编程(AOP)、数据访问、Web应用、事务管理等多种功能。笔记中...

    spring学习笔记(十五)-编程式事务例子

    在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...

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

    在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...

    Spring 学习笔记三

    《Spring 学习笔记三——深入理解Spring框架》 在我们的Spring学习旅程中,这篇笔记将带领大家更深入地探讨Spring框架的核心特性及其工作原理。Spring作为Java开发中广泛使用的轻量级框架,其强大的功能和灵活性...

Global site tag (gtag.js) - Google Analytics