Spring
				
				
						的事务处理
				
				
						
								
								
								
						
				
		
		
				
						(零雨其蒙原创,转载请注明)
				
				
						
								
								
						
				
		
		
				一、概述
		
		
				(一)基本概念
		
		
				
						1
						、什么是Spring事务处理?
				
		
		
				什么是事务处理我就不想回答了。
				Spring
				的事务处理,可以说是
				Spring AOP
				的一种实现。因为事务处理是所谓方面(
				Aspect
				)的一个子集。因此默认情况下,事务处理是利用
				Java
				动态代理机制实现的,这样就必须先定义一个接口,然后再编写实现;而对于没有接口的
				Javabean
				,则通过
				CGLIB
				实现。这部分是
				Spring AOP
				部分的内容。
		
		
				
						2
						、两种事务处理方式
				
		
		
				和
				EJB
				一样,
				Spring
				也提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理。
		
		
				(二)框架图
		
		
				
						
						
								
								
								
										
										
										
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
												
										
										
										
										
										
								
								
										
												
												
												
												
												
												
										
								
								
										
										
										
										
								
								
										
												
														
																
																		
																				
																						
																								
																										
																												| 
																														 
																																实现事务处理的两种方式
																																
																																		
																																		
																																
																														 
																												 | 
																										 
																										
																												| 
																														 
																																Java
																																动态代理
																														 
																												 | 
																										 
																										
																												| 
																														 
																																CGLIB
																														 
																												 | 
																										 
																								
																						 
																						
																								
																										 
																								
																						 
																				 
																		 | 
																
														
												
										
								
								
										
												
										
								
								
								
								
								
								
								
								
						
				
		
		
				(三)何时使用什么
		
		
				
						          
				
				如果需要大量的事务处理,就用声明式事务处理,如果很少的事务处理,就用编程式
		
		
				二、详细
		
		
				
						              
				
				编程式事务处理与声明式事务处理
		
		
				(一)编程式事务处理
		
		
				
						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
				)使用事务处理的类
		
		
				
						 
				
		
		
				
						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>