Spring 的事务处理
2014-01-12 22:13
330 查看
(一)基本概念
1 、什么是Spring事务处理?
什么是事务处理我就不想回答了。 Spring 的事务处理,可以说是 Spring AOP 的一种实现。因为事务处理是所谓方面( Aspect )的一个子集。因此默认情况下,事务处理是利用 Java 动态代理机制实现的,这样就必须先定义一个接口,然后再编写实现;而对于没有接口的 Javabean ,则通过 CGLIB 实现。这部分是 Spring AOP 部分的内容。2 、两种事务处理方式
和 EJB 一样, Spring 也提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理。(二)框架图
|
|
(三)何时使用什么
如果需要大量的事务处理,就用声明式事务处理,如果很少的事务处理,就用编程式二、详细
编程式事务处理与声明式事务处理(一)编程式事务处理
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;
}
}
[U1] )
}
}
如果不想返回结果( 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 )使用事务处理的类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>
相关文章推荐
- Spring源代码解析(六):Spring声明式事务处理
- Hibernate 事务处理和spring中配置事务
- 《Spring技术内幕》学习笔记14——Spring读取和处理事务配置
- AOP应用实例--Spring事务处理及其AOP框架的内幕
- spring配置事务处理的五种方式
- Spring 注解学习手札(五) 业务层事务处理
- Spring有几种事务处理方式?举例说明
- spring入门之ssh中事务处理,数据库连接,spring配置文件
- 统一Spring 和 非spring事务处理的方案
- MyBatis集合Spring(四)之使用Spring处理事务
- Spring 的事务处理
- Spring+Hibernate延迟和声明式事务处理最终解决方案
- Spring框架内容整理(四):Spring事务处理
- Spring事务处理及其AOP框架的内幕
- Spring的事务处理机制
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 使用AOP执行事务处理
- Spring事务处理详解
- spring技术内幕14-Spring读取和处理事务配置
- spring事务处理详解
- MyBatis3整合Spring3的Transaction事务处理