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

来源:互联网 发布:兰蔻气垫好不好知乎 编辑:程序博客网 时间:2024/05/02 04:59
[Java] view plaincopy
  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.     /** Logger available to subclasses */  
  17.     protected final Log logger = LogFactory.getLog(getClass());  
  18.   
  19.     private PlatformTransactionManager transactionManager;  
  20.   
  21.   
  22.       
  23.     public TransactionTemplate() {  
  24.     }  
  25.   
  26.     sactionTemplate(PlatformTransactionManager transactionManager) {  
  27.         this.transactionManager = transactionManager;  
  28.     }  
  29.   
  30.       
  31.     public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) {  
  32.         super(transactionDefinition);  
  33.         this.transactionManager = transactionManager;  
  34.     }  
  35.   
  36.   
  37.     /** 
  38.      * Set the transaction management strategy to be used. 
  39.      */  
  40.     public void setTransactionManager(PlatformTransactionManager transactionManager) {  
  41.         this.transactionManager = transactionManager;  
  42.     }  
  43.   
  44.     /** 
  45.      * Return the transaction management strategy to be used. 
  46.      */  
  47.     public PlatformTransactionManager getTransactionManager() {  
  48.         return this.transactionManager;  
  49.     }  
  50.   
  51.     public void afterPropertiesSet() {  
  52.         if (this.transactionManager == null) {  
  53.             throw new IllegalArgumentException("Property 'transactionManager' is required");  
  54.         }  
  55.     }  
  56.   
  57.   
  58.     public Object execute(TransactionCallback action) throws TransactionException {  
  59.         if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {  
  60.             return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);  
  61.         }  
  62.         else {  
  63.             TransactionStatus status = this.transactionManager.getTransaction(this);  
  64.             Object result = null;  
  65.             try {  
  66.                 result = action.doInTransaction(status);  
  67.             }  
  68.             catch (RuntimeException ex) {  
  69.                 // Transactional code threw application exception -> rollback  
  70.                 rollbackOnException(status, ex);  
  71.                 throw ex;  
  72.             }  
  73.             catch (Error err) {  
  74.                 // Transactional code threw error -> rollback  
  75.                 rollbackOnException(status, err);  
  76.                 throw err;  
  77.             }  
  78.             this.transactionManager.commit(status);  
  79.             return result;  
  80.         }  
  81.     }  
  82.   
  83.     private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException {  
  84.         logger.debug("Initiating transaction rollback on application exception", ex);  
  85.         try {  
  86.             this.transactionManager.rollback(status);  
  87.         }  
  88.         catch (TransactionSystemException ex2) {  
  89.             logger.error("Application exception overridden by rollback exception", ex);  
  90.             ex2.initApplicationException(ex);  
  91.             throw ex2;  
  92.         }  
  93.         catch (RuntimeException ex2) {  
  94.             logger.error("Application exception overridden by rollback exception", ex);  
  95.             throw ex2;  
  96.         }  
  97.         catch (Error err) {  
  98.             logger.error("Application exception overridden by rollback error", ex);  
  99.             throw err;  
  100.         }  
  101.     }  
  102.   
  103. }<pre></pre>  
  104. <pre></pre>  
  105. <p> </p>  
  106. <p>1 <span style="font-family:宋体">、使用<span lang="EN-US">TransactionTemplate</span>进行事务处理(<span lang="EN-US">Spring</span>进行<span lang="EN-US">commit</span>和<span lang="EN-US">rollback</span>)</span></p>  
  107. <p><span style="font-size:24px"><span style="font-family:宋体">  <span style="font-family:宋体">  
  108. (</span> <span lang="EN-US">1</span> <span style="font-family:宋体">)使用事务处理的类</span>  
  109. </span></span></p>  
  110. <pre class="Java" name="code">import javax.sql.DataSource;   
  111.   
  112. import org.springframework.jdbc.core.*;   
  113.   
  114. import org.springframework.transaction.*;   
  115.   
  116. import org.springframework.dao.*;   
  117.   
  118.     
  119.   
  120. public class bookDAO{   
  121.   
  122. private DataSource dataSource;// 依赖注入 dataSource ,管理数据库   
  123.   
  124. private PlatformTransationManager transactionManager;// 依赖注入管理事务   
  125.   
  126.     
  127.   
  128. public void setDataSource(DataSource dataSource){   
  129.   
  130.     this.dataSource=dataSource;   
  131.   
  132. }   
  133.   
  134.     
  135.   
  136.      public void setTransactionManager(PlatformTransationManager transactionManager){   
  137.   
  138.          this. transactionManager= transactionManager;   
  139.   
  140. }   
  141.   
  142.     
  143.   
  144. public int create(String msg){   
  145.   
  146.     TransactionTemplate transactionTemplate=new TransactionTemplate(transactionManager);   
  147.   
  148.     // 调用 transactionTemplate 的 execute 方法进行事务管理   
  149.   
  150.     Object result= transactionTemplate.execute (   
  151.   
  152.      // 这是一个回调函数,实现了 TransactionCallback 接口的 doInTransaction 方法,就是在这个方法里写数据库新增数据的操作   
  153.   
  154.           new TransactionCallback()   
  155.   
  156. {   
  157.   
  158.           public Object doInTransaction(TransactionStatus status)   
  159.   
  160. {   
  161.   
  162.               // 数据库操作代码   
  163.   
  164.               return resultObject;   
  165.   
  166.            }   
  167.   
  168.        }   
  169.   
  170.    )   
  171.   
  172. }   
  173.   
  174. }   
  175. <pre></pre>  
  176. <pre></pre>  
  177. <p> </p>  
  178. <p><span lang="EN-US"><span style="font-family:宋体">(</span> <span lang="EN-US">2</span>  
  179. <span style="font-family:宋体">)配置文件</span> </span></p>  
  180. <p><span lang="EN-US"> </span></p>  
  181. <pre class="XML" name="code">   
  182.   
  183.    
  184.   
  185. <beans>   
  186.   
  187.    <!— 设 定dataSource à   
  188.   
  189.    <bean id="”dataSource”" class="”org.springframework.jdbc.datasource.DriverManagerDataSource”">   
  190.   
  191.       <!— 使用SQL Server 数 据 库 à   
  192.   
  193.        <property name="”driverClassName”">   
  194.   
  195.           <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>   
  196.   
  197.           
  198.   
  199.         <property name="”url”">   
  200.   
  201.           <value>jdbc:Microsoft:sqlserver://localhost:1433/stdb</value>   
  202.   
  203.        </property>   
  204.   
  205. <property name="”name”">   
  206.   
  207.           <value>admin</value>   
  208.   
  209.        </property>   
  210.   
  211. <property name="”msg”">   
  212.   
  213.           <value>admin</value>   
  214.   
  215.        </property>   
  216.   
  217.     </property></bean>   
  218.   
  219.     
  220.   
  221.     <!— 设定 transactionManager à   
  222.   
  223.     <bean id="”transactionManager”" class="”org.springframework.jdbc.datasource.DataSourceTransactionManager”">   
  224.   
  225.         <property name="”dataSource”">   
  226.   
  227.             <ref bean="”dataSource”/">   
  228.   
  229.         </ref></property>   
  230.   
  231.     </bean>   
  232.   
  233.     
  234.   
  235.    <!— 示例中 DAO-->   
  236.   
  237.     <bean id="”bookDAO”" class="”com.bookDAO”">   
  238.   
  239.         <property name="”dataSource”">   
  240.   
  241.             <ref bean="”dataSource”/">   
  242.   
  243.         </ref></property>   
  244.   
  245.         <property name="”transactionManager”">   
  246.   
  247.             <ref bean="”transactionManager”">   
  248.   
  249.         </ref></property>   
  250.   
  251.    </bean>   
  252.   
  253. </beans>   
  254.   
  255. <pre></pre>  
  256. <pre></pre>  
  257. <p>二,<span style="font-family:宋体">如果不想返回结果(</span> <span lang="EN-US">resultObject</span>  
  258. <span style="font-family:宋体">),则可以用</span> <span lang="EN-US">TransactionCallbackWithoutResult</span>  
  259. <span style="font-family:宋体">来实现</span> <span lang="EN-US">TransactionCallback</span>  
  260. <span style="font-family:宋体">接口,代码如下:</span> </p>  
  261. <p></p>  
  262. <pre class="Java" name="code">        new TransactionCallback WithoutResult ()   
  263.   
  264. {   
  265.   
  266.           public Object doInTransaction WithoutResult (TransactionStatus status)   
  267.   
  268. {   
  269.   
  270.               // 数据库操作代码   
  271.   
  272.                
  273.   
  274.            }   
  275.   
  276.        }   
  277. <pre></pre>  
  278. <pre></pre>  
  279. <p> </p>  
  280. <p>三,</p>  
  281. <pre class="Java" name="code">import javax.sql.DataSource;   
  282.   
  283. import org.springframework.jdbc.core.*;   
  284.   
  285. import org.springframework.transaction.*;   
  286.   
  287. import org.springframework.dao.*;   
  288.   
  289.     
  290.   
  291. public class bookDAO{   
  292.   
  293. private DataSource dataSource;// 依赖注入 dataSource ,管理数据库   
  294.   
  295. private PlatformTransationManager transactionManager;// 依赖注入管理事务   
  296.   
  297.     
  298.   
  299. public void setDataSource(DataSource dataSource){   
  300.   
  301.     this.dataSource=dataSource;   
  302.   
  303. }   
  304.   
  305.     
  306.   
  307.      public void setTransactionManager(PlatformTransationManager transactionManager){   
  308.   
  309.          this. transactionManager= transactionManager;   
  310.   
  311. }   
  312.   
  313.     
  314.   
  315. public int create(String msg){   
  316.     DefaultTransactionDefinition def =new DefaultTransactionDefinition();   
  317.   
  318.    TransactionStatus status=transactionManager.getTransaction(def);   
  319.   
  320.    try   
  321.   
  322. {   
  323.   
  324.         JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);   
  325.   
  326.         jdbcTemplate.update(“INSERT INTO book VALUES(1,’gf’,’Mastering Spring’)”);   
  327.   
  328.    }   
  329.   
  330.    catch(DataAccessException ex)   
  331.   
  332. {   
  333.   
  334.        transactionzManager.rollback(status);   
  335.   
  336.        throw ex;   
  337.   
  338.    }   
  339.   
  340.    finally   
  341.   
  342.    {   
  343.   
  344.         transactionManager.commit(status);   
  345.   
  346.    }   
  347.   
  348. }   
  349.   
  350. }   
  351. <pre></pre>  
  352. <pre></pre>  
  353. <p> </p>  
  354.   
  355. </pre></pre></pre></pre>  
0 0
原创粉丝点击