Spring也提供了声明式事务管理。这是通过Spring AOP实现的。
Spring 中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样,具体细节请参考jdk中有关动态代理的文档。本文主要讲解如何在spring中进行事务控制。
动态代理的一个重要特征是,它是针对接口的,所以我们的dao要通过动态代理来让spring接管事务,就必须在dao前面抽象出一个接口,当然如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式,所以不做讨论.
大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择, 因而这是和非侵入性的轻量级容器的观念是一致的。
从考虑EJB CMT和Spring声明式事务管理的相似以及不同之处出发是很有益的。 它们的基本方法是相似的:都可以指定事务管理到单独的方法;如果需要可以在事务上 下文调用setRollbackOnly()方法。不同之处如下:
不象EJB CMT绑定在JTA上,Spring声明式事务管理可以在任何环境下使用。 只需更改配置文件,它就可以和JDBC、JDO、Hibernate或其他的事务机制一起工作
Spring可以使声明式事务管理应用到普通Java对象,不仅仅是特殊的类,如EJB
Spring提供声明式回滚规则:EJB没有对应的特性, 我们将在下面讨论这个特性。回滚可以声明式控制,不仅仅是编程式的
Spring允许你通过AOP定制事务行为。例如,如果需要,你可以在事务 回滚中插入定制的行为。你也可以增加任意的通知,就象事务通知一样。使用 EJB CMT,除了使用setRollbackOnly(),你没有办法能 够影响容器的事务管理
Spring不提供高端应用服务器提供的跨越远程调用的事务上下文传播。如 果你需要这些特性,我们推荐你使用EJB。然而,不要轻易使用这些特性。通常我 们并不希望事务跨越远程调用
回滚规则的概念是很重要的:它们使得我们可以指定哪些异常应该发起自 动回滚。我们在配置文件中,而不是Java代码中,以声明的方式指定。因此,虽然我们仍 然可以编程调用TransactionStatus对象的 setRollbackOnly()方法来回滚当前事务,多数时候我们可以 指定规则,如MyApplicationException应该导致回滚。 这有显著的优点,业务对象不需要依赖事务基础设施。例如,它们通常不需要引 入任何Spring API,事务或其他任何东西。
EJB的默认行为是遇到系统异常(通常是运行时异常), EJB容器自动回滚事务。EJB CMT遇到应用程序异常 (除了java.rmi.RemoteException外的checked异常)时不 会自动回滚事务。虽然Spring声明式事务管理沿用EJB的约定(遇到unchecked 异常自动回滚事务),但是这是可以定制的。
按照我们的测试,Spring声明式事务管理的性能要胜过EJB CMT。
通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时,必须提供一个相关的 PlatformTransactionManager的引用和事务属性。 事务属性含有上面描述的事务定义。
<bean id="petStore"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref bean="petStoreTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
事务代理会实现目标对象的接口:这里是id为petStoreTarget的bean。(使用 CGLIB也可以实现具体类的代理。只要设置proxyTargetClass属性为true就可以。如果目标对象没有实现任何接口,这将自动设置该属性为true。通常,我们希望面向接口而不是类编程。)使用proxyInterfaces属性来限定事务代理来代 理指定接口也是可以的(一般来说是个好想法)。也可以通过从 org.springframework.aop.framework.ProxyConfig继承或所有AOP代理工厂共享 的属性来定制TransactionProxyFactoryBean的行为。
这里的transactionAttributes属性定义在 org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource 中的属性格式来设置。这个包括通配符的方法名称映射是很直观的。注意 insert*的映射的值包括回滚规则。添加的-MyCheckedException 指定如果方法抛出MyCheckedException或它的子类,事务将 会自动回滚。可以用逗号分隔定义多个回滚规则。-前缀强制回滚,+前缀指定提交(这允许即使抛出unchecked异常时也可以提交事务,当然你自己要明白自己 在做什么)。
TransactionProxyFactoryBean允许你通过 “preInterceptors”和“postInterceptors”属性设置“前”或“后”通知来提供额外的 拦截行为。可以设置任意数量的“前”和“后”通知,它们的类型可以是 Advisor(可以包含一个切入点), MethodInterceptor或被当前Spring配置支持的通知类型 (例如ThrowAdvice, AfterReturningtAdvice或BeforeAdvice, 这些都是默认支持的)。这些通知必须支持实例共享模式。如果你需要高级AOP特 性来使用事务,如有状态的maxin,那最好使用通用的 org.springframework.aop.framework.ProxyFactoryBean, 而不是TransactionProxyFactoryBean实用代理创建者。
也可以设置自动代理:配置AOP框架,不需要单独的代理定义类就可以生成类的 代理。
附两个spring的事务配置例子:
<prop key="add">
PROPAGATION_REQUIRES_NEW, -MyException
</prop>
注:上面的意思是add方法将独占一个事务,当事务处理过程中产生MyException异常或者该异常的子类将回滚该事务。
<prop key="loadAll">
PROPAGATION_SUPPORTS, ISOLATION_READ_COMMITED, Readonly
</prop>
注:表示loadAll方法支持事务,而且不会读取没有提交事务的数据。它的数据为只读(这样有助于提高读取的性能)
附A Spring中的所有事务策略
PROPAGATION_MANDATORY
PROPAGATION_NESTED
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED_NEW
PROPAGATION_SUPPORTS
附B Spring中所有的隔离策略:
ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITED
ISOLATION_COMMITED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
出处:http://www.blogjava.net/DenisLing/archive/2005/12/01/22096.html
分享到:
相关推荐
在事务管理方面,Spring提供了编程式和声明式两种事务管理方式,书中有详细的解释和示例,帮助读者理解何时及如何选择合适的方式。 安全是任何应用都需要考虑的问题,Spring Security提供了一套全面的安全解决方案...
Spring提供了编程式和声明式事务管理两种方式,让开发者可以轻松处理事务边界,确保数据的一致性。作者会解释事务的ACID属性,以及如何在实际应用中结合JDBC或ORM框架(如Hibernate)使用Spring的事务管理。 在数据...
此外,还讨论了Spring的事务管理功能,包括编程式和声明式事务管理,以及事务的隔离级别和传播行为。 书中还介绍了Spring的其他重要模块,如Spring Batch用于批处理操作,Spring Integration提供企业服务集成,...
6. **事务管理**:讲解Spring的事务管理功能,包括编程式事务管理和声明式事务管理,以及事务的传播行为。 7. **AOP**:阐述面向切面编程的基本原理,如何定义切面、通知类型以及如何在Spring中实现AOP。 8. **...
7. **事务管理**:学习Spring的声明式事务管理,了解如何在事务边界内协调多个数据库操作,确保数据的一致性。 8. **Spring Boot**:探讨Spring Boot如何简化Spring应用的启动和配置,以及其内置的各种特性,如自动...
6. **数据访问**:涉及JDBC模板、Hibernate、MyBatis等持久层集成,讲解事务管理的编程式和声明式两种方式。 7. **Spring Boot**:简述Spring Boot的自动化配置和起步依赖,以及如何快速构建微服务应用。 8. **...
讨论事务管理策略,包括编程式和声明式事务管理。 6. **Spring MVC**:讲解Spring的Web MVC框架,如何构建RESTful服务,处理HTTP请求,视图解析,以及Model-View-Controller模式在Spring中的应用。 7. **Spring ...
2. 事务管理:详述Spring的事务管理特性,包括编程式和声明式事务管理,以及在不同类型的数据库上实现事务一致性。 第三部分,6.Spring_in_Action中文版(第二版)_part06.pdf,可能涉及Spring的Web开发和集成其他...
- **8.4 集成JPA**:讨论了Spring如何支持Java Persistence API(JPA),包括EntityManager的配置、实体管理和声明式事务。 2. **Spring的事务管理**: - **9.1 数据库事务概述**:解释了事务的基本概念,如ACID...
6. **事务管理**:阐述Spring的声明式和编程式事务管理,以及它们在多层应用中的应用。 7. **Spring Boot**:介绍Spring Boot的特性,如自动配置、起步依赖和嵌入式Web服务器,以及如何快速启动Spring项目。 8. **...
- **9.4 声明式事务**:详细阐述了基于注解和基于XML的声明式事务管理,如@Transactional注解的使用以及transaction-config元素的配置。 3. **Spring与其他Web框架的集成**: - **10.1 概述**:概述了Spring与...
在事务管理方面,Spring提供了声明式事务处理,使得开发者无需在业务代码中显式处理事务,而是通过配置文件或注解来定义事务边界。这一特性极大地简化了事务管理,降低了出错的可能性。 数据访问是Spring的另一个...
- **事务处理**:Spring提供了强大的事务管理功能,支持编程式和声明式事务管理。 - **事务隔离级别**:介绍了不同事务隔离级别的概念及其在Spring中的配置方式。 #### 10. 验证与类型转换 - **数据验证**:Spring...
5. Spring集成Hibernate:讲解如何在Spring应用中整合Hibernate,包括配置DataSource、SessionFactory、事务管理器等,并使用Spring的声明式事务管理。 6. Spring MVC:如果文档涉及Web开发,会讲解Spring MVC框架...
在事务管理方面,书中有详尽的介绍,包括编程式事务管理和声明式事务管理的区别与使用场景,以及事务的隔离级别和传播行为。此外,书中还探讨了Spring的单元测试和集成测试支持,帮助开发者构建健壮的测试用例。 ...
3. **面向切面编程(Aspect-Oriented Programming,AOP)**:Spring AOP提供了声明式事务管理,使得事务处理更简单,同时支持自定义切面。 4. **Spring MVC**:Spring的Web MVC框架,提供模型-视图-控制器模式,...
2. **面向切面编程(Aspect-Oriented Programming,AOP)**:Spring的AOP模块提供了声明式事务管理、日志记录、性能监控等功能,允许开发者将关注点从业务逻辑中分离出来,实现代码的解耦。 3. **数据访问集成**:...
5. **事务管理**:讨论Spring JDBC如何配合Spring的事务管理,实现编程式和声明式事务控制,以及在不同隔离级别下的事务处理。 6. **批处理操作**:可能包含如何使用Spring JDBC进行数据库批处理,提高性能和效率。...
- **统一异常处理**:Spring框架支持声明式的事务管理,能够统一处理各种不同类型的异常。 - **易于测试**:Spring框架支持Mock对象和隔离测试,便于进行单元测试。 - **依赖注入(Dependency Injection):** -...