`

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

阅读更多
[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.     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. }   

 

分享到:
评论

相关推荐

    spring编程式事务实现

    Spring提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。本篇文章将聚焦于编程式事务管理,特别是如何通过`TransactionTemplate`进行事务控制。 1. **Spring编程式事务管理**: 编程式事务管理允许...

    Spring 声明式事务和Spring 编程式事务

    Spring 声明式事务和Spring 编程式事务

    spring编程式事务与声明式事务详解

    Spring 编程式事务与声明式事务详解 本文将详细解释 Spring 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...

    全面分析 Spring 的编程式事务管理及声明式事务管理

    本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际项目中合理选择。 **编程式事务管理** 编程式事务管理是通过代码直接控制事务的开始、提交、回滚等...

    spring学习笔记(十五)-编程式事务例子

    在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...

    spring_tx编程式事务代码

    总结来说,`Spring_tx编程式事务代码`主要涉及Spring的`TransactionTemplate`类,它是Spring事务管理的一种便捷工具,可以帮助开发者以编程的方式更加方便地控制事务的生命周期,同时保持代码的简洁和可维护性。...

    跟我学Spring3(9.3)Spring的事务之编程式事

    在本课程"跟我学Spring3(9.3)Spring的事务之编程式事务"中,我们将深入探讨Spring框架中的事务管理机制,特别是编程式事务管理。Spring作为Java领域中的一个核心框架,其强大的事务管理能力是它的重要特性之一。...

    全面分析_Spring_的编程式事务管理及声明式事务管理

    本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...

    Spring声明式事务处理

    在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的行为,使得代码与事务逻辑解耦,提高了代码的可读性和可维护性。 首先,我们要理解什么是事务。事务是数据库操作的一组...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    总之,Spring的声明式事务管理简化了事务处理,降低了代码的复杂性,而Hibernate的编程式事务管理则提供了更多的控制。在实际项目中,根据需求选择适合的事务管理方式,Spring和Hibernate的集成则为Java开发提供了...

    全面分析_Spring_的编程式事务管理及声明式事务管理.

    本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...

    Spring事务处理-ThreadLocal的使用

    Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中...

    spring声明式事务处理demo

    首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明...

    spring学习之八--Hibernate编程式事务

    在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...

    Spring源代码解析(六):Spring声明式事务处理.doc

    Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。声明式事务处理通过 AOP 的实现,把事务管理代码作为方面封装到业务代码中,使得事务管理代码和业务代码解藕。这使得事务管理变得更加灵活...

    spring声明事务,编程事务实现

    在 Spring 中,有两种类型的事务管理:编程式事务管理和声明式事务管理。编程式事务管理使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager。声明式事务管理有基于 tx 和 aop 名字空间的 xml ...

    Spring事务处理原理步骤详解

    声明式事务是通过在方法上添加@Transactional注解来实现事务处理的,而编程式事务则是通过编写代码来实现事务处理的。 在声明式事务中,需要在方法上添加@Transactional注解,并在配置文件中开启基于注解的事务管理...

    Spring事务管理Demo

    1. **编程式事务管理**:通过使用`PlatformTransactionManager`接口及其实现类(如`JdbcTemplate`或`HibernateTemplate`),开发者可以在代码中手动开始、提交、回滚事务。这种方式灵活性高,但容易导致事务控制代码...

Global site tag (gtag.js) - Google Analytics