一、概述
(一)基本概念
1、什么是Spring事务处理?
Spring的事务处理,可以说是 Spring AOP 的一种实现。因为事务处理是所谓方面( Aspect )的一个子集。因此默认情况下,事务处理是利用 Java 动态代理机制实现的,这样就必须先定义一个接口,然后再编写实现;而对于没有接口的 Javabean ,则通过CGLIB 实现。这部分是 Spring AOP 部分的内容。
2 、两种事务处理方式
和 EJB 一样, Spring 也提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理。
(二)框架图
实现事务处理的两种方式
1、Java 动态代理
2、CGLIB
两种事务处理方式
1、编程式事务处理
2、声明式事务处理
(三)何时使用什么
如果需要大量的事务处理,就用声明式事务处理,如果很少的事务处理,就用编程式
二、详细
编程式事务处理与声明式事务处理
(一)编程式事务处理
1 、使用TransactionTemplate进行事务处理(Spring进行commit和rollback)
( 1 )使用事务处理的类
import javax.sql.DataSource; import org.springframework.jdbc.core.*; import org.springframework.transaction.*; import org.springframework.dao.*; public class bookDAO { private DataSource dataSource; // 依赖注入 dataSource ,管理数据库 private PlatformTransationManager transactionManager; // 依赖注入管理事务 public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void setTransactionManager(PlatformTransationManager transactionManager) { this.transactionManager = transactionManager; } public int create(String msg){ TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager); // 调用 transactionTemplate 的 execute 方法进行事务管理 Object result= transactionTemplate.execute ( // 这是一个回调函数,实现了 TransactionCallback 接口的 doInTransaction 方法,就是在这个方法里写数据库新增数据的操作 new TransactionCallback(){ public Object doInTransaction(TransactionStatus status){ // 数据库操作代码 return resultObject; } } ) } }
如果不想返回结果( resultObject ),则可以用 TransactionCallbackWithoutResult 来实现 TransactionCallback 接口,代码如下:
new TransactionCallback WithoutResult (){ public Object doInTransaction WithoutResult (TransactionStatus status){ // 数据库操作代码 } }
( 2 )配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 设定dataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 使用SQL Server 数据库 --> <property name="driverClassName"> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </property> <property name="url"> <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value> </property> <property name="name"> <value>admin</value> </property> <property name="msg"> <value>admin</value> </property> </bean> <!-- 设定transactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <!-- 示例中 DAO --> <bean id="bookDAO" class="com.bookDAO"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="transactionManager"> <ref bean="transactionManager"> </property> </bean> </beans>
这样 Spring 就可以自动进行 commit 和 rollback 这两个操作了。粉色部分是为了和 bookDAO 中的粉色部分相匹配。
2 、使用JdbcTemplate进行事务处理(硬编码进行commit和rollback)
( 1 )使用事务处理的类
import javax.sql.DataSource; import org.springframework.jdbc.core.*; import org.springframework.transaction.*; import org.springframework.dao.*; public class bookDAO { private DataSource dataSource; // 依赖注入 dataSource ,管理数据库 private PlatformTransationManager transactionManager; // 依赖注入管理事务 public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void setTransactionManager(PlatformTransationManager transactionManager) { this.transactionManager = transactionManager; } public int create(String msg){ /* TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager); Object result= transactionTemplate.execute ( new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { return resultObject; } } )*/ // 使用下面的代码替换上面注释掉的部分 DefaultTransactionDefinition def =new DefaultTransactionDefinition(); TransactionStatus status=transactionManager.getTransaction(def); try { JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”); } catch(DataAccessException ex) { transactionzManager.rollback(status); throw ex; } finally { transactionManager.commit(status); } } }
( 2 )配置文件
同上
( 二)声明式事务处理
1、
( 1 )使用事务处理的类
import javax.sql.DataSource; import org.springframework.jdbc.core.*; import org.springframework.transaction.*; import org.springframework.dao.*; public class bookDAO { private DataSource dataSource; // 依赖注入 dataSource ,管理数据库 private PlatformTransationManager transactionManager; // 依赖注入管理事务 public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void setTransactionManager(PlatformTransationManager transactionManager) { this.transactionManager = transactionManager; } public int create(String msg){ ① /* TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager); Object result= transactionTemplate.execute ( new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { return resultObject; } } )*/ ② /* DefaultTransactionDefinition def=new DefaultTransactionDefinition(); TransactionStatus status=transactionManager.getTransaction(def); try { JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”); } catch(DataAccessException ex) { transactionzManager.rollback(status); throw ex; } finally { transactionManager.commit(status); } */ // 使用下面的代码替换上面注释掉的部分 JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource); jdbcTemplate.update(“INSERT INFO book VALUES(1,’gf’,’Mastering Spring’)”); / / 与 ② 相比,此段代码省去了 commit 和 rollback 事务处理语句;与 ① 相比,不必实现 TransactionCallback 接口 } }
( 2 )配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 设定dataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 使用SQL Server 数据库 --> <property name="driverClassName"> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </property> <property name="url"> <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value> </property> <property name="name"> <value>admin</value> </property> <property name="msg"> <value>admin</value> </property> </bean> <!-- 设定 transactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <!-- 示例中 DAO--> <bean id="bookDAO" class="com.bookDAO"> <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 与编程式事务处理相比,在 DAO 设置中去掉了这个属性,把它放到了代理类中。 --> <!-- <property name="transactionManager"> <ref bean="transactionManager"> </property> --> </bean> <!-- 声明式事务处理 --> <bean id="bookDAOProxy" class="org.springframework.transaction.interceptor.Transation.ProxyFactoryBean"> <property name="transacionManager"> <ref bean="transacionMaganer" /> </property> <property name="target"> <ref bean="bookDAO" /> </property> <property name="transactionAttributes"> <props> <!-- 表示对 bookDAO 中的 create 方法进行事务处理,并指明当前没有事务就新建一个(用PROPAGATION_REQUIRED 常量来表示的) --> <prop key="create * ">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
2、
在applicationContext.xml中配置
<?xml version="1.0" encoding="gbk"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://localhost:1500;databaseName=ssh">
</property>
<property name="username" value="sa"></property>
<property name="password" value="sa"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>bank/entity/Account.hbm.xml</value>
</list>
</property>
</bean>
<bean id="AccountDAO" class="bank.dao.AccountDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="AccountManager" class="bank.biz.AccountManager">
<property name="dao">
<ref bean="AccountDAO" />
</property>
</bean>
<bean name="/account" class="bank.action.AccountAction">
<property name="accountManager">
<ref bean="AccountManager" />
</property>
</bean>
<!--通用事务管理器-->
<bean id="TransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--指定事务策略,声明一个通知,用以指出要管理哪些事务方法及如何管理-->
<tx:advice id="txAdvice" transaction-manager="TransactionManager">
<tx:attributes>
<!-- 对get/load/search开头的方法要求只读事务 -->
<tx:method name="find*" propagation="SUPPORTS"
read-only="true" />
<!-- 对其它方法要求事务 -->
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--声明一个config,用以将事务策略和业务类关联起来-->
<aop:config>
<!-- 添加事务支持,因为前面配置的transactionManager是专对Hibernate的事务管理器-->
<aop:pointcut id="bizMethods" expression="execution(* bank.biz..*.*(..))" />
<!-- 织入 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
</aop:config>
</beans>
相关推荐
### AOP与Spring事务处理详解 #### 一、引言:为什么使用框架和设计模式? 在软件开发领域,设计模式和框架是两个重要的概念。设计模式作为一种指导思想,能够帮助开发者更好地解决常见的软件设计问题,确保系统...
Spring 事务处理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本篇将深入探讨Spring声明式事务...
Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中...
Spring事务处理原理步骤详解 Spring事务处理原理步骤详解是指在Spring框架中实现事务处理的整个过程,它涉及到事务处理的实现、事务处理原理和事务管理器的配置等几个方面。下面是Spring事务处理原理步骤详解的知识...
### Spring事务处理详解 在Java企业级应用开发中,事务管理是确保数据一致性和完整性的重要环节。Spring框架提供了丰富的事务管理功能,可以帮助开发者更轻松地处理复杂的业务逻辑中的事务问题。本文将详细介绍...
本教程主要聚焦于Spring框架的两大核心特性:Spring AOP(面向切面编程)和Spring事务处理,通过具体的应用案例来深入理解这两个概念。 首先,让我们详细探讨Spring AOP。AOP是面向切面编程的缩写,它允许程序员...
这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...
Spring事务管理提供了统一的事务处理模型,使得开发者无需关注具体数据库访问技术的事务细节,简化了事务控制代码,提高了代码的可读性和可维护性。无论是使用注解还是AOP配置,都能有效地管理和协调事务,确保应用...
总的来说,Spring事务管理通过其强大的声明式事务处理能力和对各种事务策略的支持,使得开发者能够轻松地在应用程序中实现高效、一致的事务处理。通过理解并合理运用上述知识点,开发者可以构建出稳定、健壮的分布式...
虽然提供的示例是入门级别的,但它揭示了Spring事务管理的核心概念,为进一步学习和理解Spring事务处理的高级特性奠定了基础。在实际项目中,我们需要根据需求选择合适的配置,确保事务的正确性和数据的一致性。
总的来说,Spring事务管理是一个强大的工具,它简化了事务处理的复杂性,使得开发者能够专注于业务逻辑,而无需过多关注事务的细节。通过理解和使用Spring事务流程图,我们可以更好地设计和优化我们的应用程序,确保...
本篇文章将深入探讨Spring事务处理的流程和原理。 一、事务理论学习 事务是数据库操作的基本单位,它封装了一组数据库操作,要么全部执行,要么全部回滚。事务具有四大特性,即ACID(原子性Atomicity、一致性...
在使用Spring事务处理时,需要在配置文件中定义事务管理器,并将其注入到目标对象中。目标对象可以是Service层或DAO层,事务管理器将根据事务的配置来控制事务的行为。 Spring的事务处理提供了多种事务传播行为,...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
Spring 源代码分析系列涵盖了多个关键模块,包括事务处理、IoC容器、JDBC、MVC、AOP以及与Hibernate和Acegi安全框架的集成。以下是对这些知识点的详细阐述: 1. **Spring 事务处理**:Spring 提供了声明式事务管理...
首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明...
Spring框架的声明式事务处理是Java企业级应用中不可或缺的一部分,它为开发者提供了一种方便、高效的方式来管理事务。在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本资源包提供了进行Spring事务管理开发所需的所有关键库...理解并掌握这些知识点,将有助于构建稳定、健壮的事务处理系统。