Spring的事务处理之编程式事务处理

[Java]   view plain copy
 
  1. package org.springframework.transaction.support;  
  2.   
  3. import org.apache.commons.logging.Log;  
  4. import org.apache.commons.logging.LogFactory;  
  5.   
  6. import org.springframework.beans.factory.InitializingBean;  
  7. import org.springframework.transaction.PlatformTransactionManager;  
  8. import org.springframework.transaction.TransactionDefinition;  
  9. import org.springframework.transaction.TransactionException;  
  10. import org.springframework.transaction.TransactionStatus;  
  11. import org.springframework.transaction.TransactionSystemException;  
  12.   
  13. public class TransactionTemplate extends DefaultTransactionDefinition  
  14.         implements TransactionOperations, InitializingBean {  
  15.   
  16.     protected final Log logger = LogFactory.getLog(getClass());  
  17.   
  18.     private PlatformTransactionManager transactionManager;  
  19.       
  20.     public TransactionTemplate() {  
  21.     }  
  22.   
  23.     sactionTemplate(PlatformTransactionManager transactionManager) {  
  24.         this.transactionManager = transactionManager;  
  25.     }  
  26.    
  27.     public TransactionTemplate(PlatformTransactionManager transactionManager, 
  28.                           TransactionDefinition transactionDefinition) {  
  29.         super(transactionDefinition);  
  30.         this.transactionManager = transactionManager;  
  31.     }  
  32.   
  33.     /** 
  34.      * Set the transaction management strategy to be used. 
  35.      */  
  36.     public void setTransactionManager(PlatformTransactionManager transactionManager) {  
  37.         this.transactionManager = transactionManager;  
  38.     }  
  39.   
  40.     /** 
  41.      * Return the transaction management strategy to be used. 
  42.      */  
  43.     public PlatformTransactionManager getTransactionManager() {  
  44.         return this.transactionManager;  
  45.     }  
  46.   
  47.     public void afterPropertiesSet() {  
  48.         if (this.transactionManager == null) {        
  49.                throw new IllegalArgumentException
  50.                      ("Property 'transactionManager' is required");  
  51.         }  
  52.     }  
  53.     public Object execute(TransactionCallback action) throws TransactionException {  
  54.         if (this.transactionManager instanceof 
  55.                      CallbackPreferringPlatformTransactionManager) {  
  56.             return ((CallbackPreferringPlatformTransactionManager) 
  57.                this.transactionManager).execute(this, action);  
  58.         }  else {  
  59.             TransactionStatus status = this.transactionManager.getTransaction(this);  
  60.             Object result = null;  
  61.             try {  
  62.                 result = action.doInTransaction(status);  
  63.             }  
  64.             catch (RuntimeException ex) {  
  65.                 // Transactional code threw application exception -> rollback  
  66.                 rollbackOnException(status, ex);  
  67.                 throw ex;  
  68.             }  
  69.             catch (Error err) {  
  70.                 // Transactional code threw error -> rollback  
  71.                 rollbackOnException(status, err);  
  72.                 throw err;  
  73.             }  
  74.             this.transactionManager.commit(status);  
  75.             return result;  
  76.         }  
  77.     }  
  78.   
  79.     private void rollbackOnException(TransactionStatus status, Throwable ex) 
  80.                                                      throws TransactionException {  
  81.         logger.debug("Initiating transaction rollback on application exception", ex);  
  82.         try {  
  83.             this.transactionManager.rollback(status);  
  84.         }  
  85.         catch (TransactionSystemException ex2) {  
  86.             logger.error("Application exception overridden by rollback exception", ex);  
  87.             ex2.initApplicationException(ex);  
  88.             throw ex2;  
  89.         }  
  90.         catch (RuntimeException ex2) {  
  91.             logger.error("Application exception overridden by rollback exception", ex);  
  92.             throw ex2;  
  93.         }  
  94.         catch (Error err) {  
  95.             logger.error("Application exception overridden by rollback error", ex);  
  96.             throw err;  
  97.         }  
  98.     }  
  99.   } 
  100.  
  101. 1 、使用TransactionTemplate进行事务处理Spring进行commit和rollback) 
  102. (1使用事务处理的类)
  103. import javax.sql.DataSource;   
  104.   
  105. import org.springframework.jdbc.core.*;   
  106.   
  107. import org.springframework.transaction.*;   
  108.   
  109. import org.springframework.dao.*;   
  110.   
  111. public class bookDAO{   
  112.   
  113. private DataSource dataSource;// 依赖注入 dataSource ,管理数据库   
  114.   
  115. private PlatformTransationManager transactionManager;// 依赖注入管理事务   
  116.   
  117. public void setDataSource(DataSource dataSource){   
  118.     this.dataSource=dataSource;   
  119. }   
  120.      
  121. public void setTransactionManager(PlatformTransationManager transactionManager){   
  122.          this. transactionManager= transactionManager;   
  123. }   
  124.    
  125. public int create(String msg){   
  126.   
  127.     TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);   
  128.   
  129.     // 调用 transactionTemplate 的 execute 方法进行事务管理   
  130.     Object result= transactionTemplate.execute (   
  131.           // 这是一个回调函数,实现了 TransactionCallback 接口的 doInTransaction 方法,
  132.           //就是在这个方法里写数据库新增数据的操作   
  133.           new TransactionCallback() {   
  134.             public Object doInTransaction(TransactionStatus status)   {   
  135.               // 数据库操作代码   
  136.               return resultObject;   
  137.            }    
  138.          }     
  139.      )     
  140.   }     
  141. }   
  142. (2)配置文件XML)
  143.   
  144. <beans>   
  145.    <!— 设 定dataSource -->  
  146.   
  147.    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  148.       <!— 使用SQL Server 数 据 库 -->
  149.        <property name="”driverClassName”">   
  150.           <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>  
  151.       </property>   
  152.        <property name="url">   
  153.           <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>   
  154.        </property>   
  155.   
  156.        <property name="”name”">   
  157.           <value>admin</value>   
  158.        </property>   
  159.   
  160.        <property name="msg">   
  161.           <value>admin</value>   
  162.        </property>   
  163.     </bean>   
  164.   
  165.     <!— 设定 transactionManager --> 
  166.   
  167.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
  168.         <property name="dataSource">   
  169.             <ref bean="”dataSource"/>   
  170.         </property>   
  171.      </bean>   
  172.   
  173.     
  174.   
  175.    <!—  DAO-->   
  176.   
  177.     <bean id="bookDAO" class="com.bookDAO">   
  178.         <property name="dataSource">   
  179.             <ref bean="dataSource"/>   
  180.         </property>   
  181.   
  182.         <property name="transactionManager">   
  183.             <ref bean="transactionManager"/>   
  184.         </property>   
  185.    </bean>   
  186. </beans>   
  187.   
  188. 二、如果不想返回结果(resultObject),则可以用TransactionCallbackWithoutResult来实现TransactionCallback接口,代码如下: 
  189.      new TransactionCallback WithoutResult () {   
  190.           public Object doInTransaction WithoutResult (TransactionStatus status)   {   
  191.               // 数据库操作代码   
  192.            }   
  193.        }   
  194. 三、  
  195. import javax.sql.DataSource;   
  196. import org.springframework.jdbc.core.*;    
  197. import org.springframework.transaction.*;    
  198. import org.springframework.dao.*;   
  199.     
  200. public class bookDAO{   
  201.   
  202. private DataSource dataSource;// 依赖注入 dataSource ,管理数据库   
  203.   
  204. private PlatformTransationManager transactionManager;// 依赖注入管理事务   
  205. public void setDataSource(DataSource dataSource){   
  206.     this.dataSource=dataSource;   
  207. }   
  208.   
  209.  public void setTransactionManager(PlatformTransationManager transactionManager){   
  210.          this. transactionManager= transactionManager;   
  211. }   
  212.    
  213. public int create(String msg){   
  214.     DefaultTransactionDefinition def =new DefaultTransactionDefinition();   
  215.   
  216.    TransactionStatus status=transactionManager.getTransaction(def);   
  217.   
  218.    try {   
  219.       JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);   
  220.       jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);   
  221.    } catch(DataAccessException ex) {   
  222.        transactionzManager.rollback(status);   
  223.        throw ex;   
  224.    }  finally {  
  225.         transactionManager.commit(status);   
  226.    }   
  227.   }    
  228. }   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值