-----------------从 Spring-framework-reference书中翻译而来--------------

    Spring中事务抽象的关键是“事务策略”的概念。“事务策略”在接口org.springframework.transaction.platformTransactionManager中定义:

 
  
  1. public interface PlactformTransactionManager{ 
  2.  TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; 
  3.  void commit(TransactionStatus status) throws TransactionException; 
  4.  void rollback(TransactionStatus status) throws TransactionException;   

   getTrasaction()方法根据参数TransactionDefinition返回一个TransactionStatus对象,这个对象可能代表一个新的事务,也可能是一个现存的事务(如果和当前调用栈中事务有匹配的话)。后面这种情况是在J2EE 事务上下文中,一个TransactionStatus是和一个执行线程相关联。

 
  
  1. public interface TransactionStatus extends SavepointManager {  
  2.       boolean isNewTransaction();  
  3.       boolean hasSavepoint();  
  4.       void setRollbackOnly();  
  5.       boolean isRollbackOnly();  
  6.       void flush();  
  7.       boolean isCompleted();  
  8. }  

  不管你用声明式还是编程式,实现PlatformTransactionManager是必须的,你可以通过依赖注入来实现。你用JDBC、JTA、Hibernate什么的也都要实现PlatformTransactionManager。

   配置JDBC数据源:

 
  
  1. <bean id="dataSource"     class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2. <property name="driverClassName" value="${jdbc.driverClassName}" />  
  3. <property name="url" value="${jdbc.url}" />  
  4. <property name="username" value="${jdbc.username}" />  
  5. <property name="password" value="${jdbc.password}" />  
  6. </bean>  
  7. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
  8. <property name="dataSource" ref="dataSource"/> 
  9. </bean> 

 使用JTA,通过JNDI获得数据源配置:

 
  
  1. <beans xmlns="http://www.springframework.org/schema/beans" 
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3. xmlns:jee="http://www.springframework.org/schema/jee" 
  4. xsi:schemaLocation=" 
  5. http://www.springframework.org/schema/beans 
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
  7. http://www.springframework.org/schema/jee 
  8. http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"> 
  9. <jee:jndi-lookup id="dataSource" jndi-name="jdbc/jpetstore"/> 
  10. <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" /> 
  11. <!-- other <bean/> definitions here --> 
  12. </beans> 

 使用Hibernate配置:

 
  
  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
  2. <property name="dataSource" ref="dataSource" /> 
  3. <property name="mappingResources"> 
  4. <list> 
  5. <value>org/springframework/samples/petclinic/hibernate/petclinic.hbm.xml</value> 
  6. </list> 
  7. </property> 
  8. <property name="hibernateProperties"> 
  9. <value> 
  10. hibernate.dialect=${hibernate.dialect} 
  11. </value> 
  12. </property> 
  13. </bean> 
  14. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
  15. <property name="sessionFactory" ref="sessionFactory" /> 
  16. </bean> 

无论是HibernateTransactionManager、DataSourceTransactionManager还是JtaTransactionManager,它们都实现了PlatformTransactionManager中的方法。