通常建议采用声明式事务管理。声明式事务管理的优势非常明显:代码中无需关于关注事务逻辑,让Spring声明式事务管理负责事务逻辑,声明式事务管理无需与具体的事务逻辑耦合,可以方便地在不同事务逻辑之间切换。
声明式事务管理的配置方式,通常有如下三种:
1.使用TransactionProxyFactoryBean为目标bean生成事务代理的配置。此方式是最传统,配置文件最臃肿、难以阅读的方式。
2.采用bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。
3.使用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。
4.DefaultAdvisorAutoProxyCreator:这也是直接利用Spring的AOP框架配置事务代理的方式,效果也非常不多,只是这种配置方式的可读性不如第三种方式。
一. 利用TransactionProxyFactoryBean生成事务代理
采用这种方式的配置时候,配置文件的增加非常快,每个bean有需要两个bean配置,一个目标,另外还需要使用TransactionProxyFactoryBean配置一个代理bean。
这是一种最原始的配置方式,下面是使用TransactionProxyFactoryBean的配置文件:
<?xml version="1.0" encoding="gb2312"?>
<!-- Spring配置文件的文件头,包含DTD等信息-->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--定义数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 定义数据库驱动-->
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<!-- 定义数据库url-->
<property name="url"><value>jdbc:mysql://localhost:3306/spring</value></property>
<!-- 定义数据库用户名-->
<property name="username"><value>root</value></property>
<!-- 定义数据库密码-->
<property name="password"><value>32147</value></property>
</bean>
<!--定义一个hibernate的SessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 定义SessionFactory必须注入DataSource-->
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<!--以下用来列出所有的PO映射文件-->
<value>Person.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!--此处用来定义hibernate的SessionFactory的属性:
不同数据库连接,启动时选择create,update,create-drop-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 定义事务管理器,使用适用于Hibernte的事务管理器-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用-->
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<!--定义DAO Bean , 作为事务代理的目标-->
<bean id="personDaoTarget" class="lee.PersonDaoHibernate">
<!-- 为DAO bean注入SessionFactory引用-->
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<!-- 定义DAO bean的事务代理-->
<bean id="personDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 为事务代理bean注入事务管理器-->
<property name="transactionManager"><ref bean="transactionManager"/></property>
<!-- 设置事务属性-->
<property name="transactionAttributes">
<props>
<!-- 所有以find开头的方法,采用required的事务策略,并且只读-->
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<!-- 其他方法,采用required的事务策略 ->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<!-- 为事务代理bean设置目标bean -->
<property name="target">
<ref local="personDaoTarget"/>
</property>
</bean>
</beans>
在上面的配置文件中,personDao需要配置两个部分,一个是personDao的目标bean,该目标bean是实际DAO bean,以实际的DAO bean为目标,建立事务代理。一个组件,需要来个bean组成,一个目标bean,一个事务代理。
这种配置方式还有一个坏处:目标bean直接暴露在Spring容器中,可以直接引用,如果目标bean被误引用,将导致业务操作不具备事务性。
为了避免这种现象,可将目标bean配置成嵌套bean,下面是目标bean和事务代理的配置片段:
<!-- 定义DAO bean的事务代理-->
<bean id="personDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 为事务代理bean注入事务管理器-->
<property name="transactionManager"><ref bean="transactionManager"/></property>
<!-- 设置事务属性-->
<property name="transactionAttributes">
<props>
<!-- 所有以find开头的方法,采用required的事务策略,并且只读-->
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<!-- 其他方法,采用required的事务策略 ->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<!-- 为事务代理bean设置目标bean -->
<property name="target">
<!-- 采用嵌套bean配置目标bean-->
<bean class="lee.PersonDaoHibernate">
<!-- 为DAO bean注入SessionFactory引用-->
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
</property>
</bean>
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
Spring 声明式事务处理 Spring 中的事务处理可以分为...Spring 的声明式事务处理使得事务管理变得更加灵活和可维护。通过使用 AOP 和 IoC 容器,我们可以轻松地实现事务管理,并且可以灵活地配置事务管理的属性信息。
在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论多数据源回滚策略。以下是对这些知识点的详细说明: 1. **动态数据源切换**: - 通过AspectJ实现数据源的动态切换,可以设置在...
在这个声明式事务管理的小示例中,我们将探讨如何使用 Spring.NET 来实现事务的自动化处理。 1. **什么是声明式事务管理?** 声明式事务管理允许开发者通过配置或注解来定义事务的边界,而不是在代码中显式地调用 ...
1. **PlatformTransactionManager**: 这是Spring事务管理的核心接口,定义了开始、提交、回滚和查询事务状态的方法。Spring提供了多种实现,如JDBC的DataSourceTransactionManager,Hibernate的...
在描述中提到了一个博客链接,虽然具体内容无法直接获取,但通常博主会分享关于Spring事务管理的实践案例、配置方式或原理分析。这种博客通常会涵盖事务的隔离级别(如读未提交、读已提交、可重复读、串行化)、事务...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用中的事务。本文将深入探讨“spring-控制事物回滚”这一主题,结合标签“源码”和“工具”,我们将从源代码层面理解Spring如何...
在Spring框架中,声明式事务管理是其核心特性之一,它极大地简化了应用程序中的事务处理。Spring 2.x版本的声明式事务配置模板是开发者常用的一种方式,它通过AOP(面向切面编程)实现事务的自动管理,使得开发者...
1. **Spring事务管理的两种方式** - **编程式事务管理**:使用`PlatformTransactionManager`接口的实现类(如`HibernateTransactionManager`),在业务代码中手动调用开始、提交、回滚等事务方法。 - **声明式事务...
4. **事务的声明式和编程式管理** Spring支持两种事务管理方式: - **声明式事务管理**:基于AOP(面向切面编程),通过在方法或类上添加@Transactional注解来声明事务属性,由Spring容器在运行时自动处理事务...
Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过PlatformTransactionManager接口实现,代码中显式地开始、提交或回滚事务。声明式事务管理则通过@Transactional注解,将事务管理...
标题"spring编程式事物"主要关注的是编程式事务管理。这种方式允许开发者通过`PlatformTransactionManager`接口和`TransactionDefinition`接口来控制事务的生命周期。在Spring中,通常使用`TransactionTemplate`或者...
Spring 框架提供了多种...在选择事务配置方式时,通常建议使用基于注解或XML的声明式事务管理,因为它们更易于维护和扩展。同时,了解每种配置方式的原理和适用场景,可以帮助我们更好地设计和实现应用程序的事务管理。
Spring 事务管理也可以与AOP结合,通过`aop:config`标签定义切点和通知,来实现事务的声明式管理。这种方式更加灵活,可以实现更细粒度的事务控制。 在实际开发中,根据项目需求和团队习惯,可以选择适合的事务...
本文将详细介绍Spring事务管理配置的五种方式,帮助你更好地理解和掌握这一关键概念。 首先,Spring事务管理通常涉及三个主要部分: 1. **DataSource**:这是数据库连接的来源,负责提供与数据库交互的资源。例如...
Spring事务管理有编程式和声明式两种方式。编程式事务管理需要程序员手动控制事务的开始、提交和回滚,而声明式事务管理则通过AOP(面向切面编程)来实现,更易于维护。通常,我们使用后者,因为它更简洁且与业务...
Spring提供了一种声明式事务管理方式,使得开发者可以在不直接编写事务控制代码的情况下,通过配置来管理事务的边界。在"spring的2个数据源的配置"中,这意味着系统可能需要处理来自两个不同数据源的数据,例如一个...
在MyBatis的SqlSessionTemplate或SqlSessionScop中,可以配置Spring事务管理,以实现事务的统一控制。 9. **最佳实践** - 将事务管理的逻辑集中在Service层,使业务逻辑和事务控制分离。 - 根据需求选择合适的事务...