`
aijuans
  • 浏览: 1558123 次
社区版块
存档分类
最新评论

Spring中事务管理浅谈

阅读更多

Spring中事务管理浅谈

By Tony Jiang@2012-1-20

Spring中对事务的声明式管理

拿一个XML举例

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:aop="http://www.springframework.org/schema/aop"  
  5.        xmlns:tx="http://www.springframework.org/schema/tx"  
  6.        xsi:schemaLocation="  
  7.        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  8.        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd  
  9.        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">  
  10.   
  11.   
  12.   事务管理目标Service  
  13.   <bean id="fooService" class="x.y.service.DefaultFooService"/>  
  14.     
  15.   切面配置,配置了切入点是执行FooService下的所有方法 和 切入点调用的通知器为txAdvice  
  16.   <aop:config>  
  17.     <aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>  
  18.     <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>  
  19.   </aop:config>  
  20.     
  21.   该通知器的具体配置,所使用的事务管理器,所配置的事务规则  
  22.   <tx:advice id="txAdvice" transaction-manager="txManager">  
  23.     <!-- the transactional semantics... -->  
  24.       
  25.     <tx:attributes>  
  26.       <!-- all methods starting with 'get' are read-only -->  
  27.         
  28.       <tx:method name="get*" read-only="true"/>  
  29.       <!-- other methods use the default transaction settings (see below) -->  
  30.         
  31.       <tx:method name="*"/>  
  32.     </tx:attributes>  
  33.   </tx:advice>  
  34.   
  35.   所选用的事务管理器,和作为启动参数塞入的dataSource  
  36.   <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  37.     <property name="dataSource" ref="dataSource"/>  
  38.   </bean>  
  39.   
  40.   
  41.   连接数据库的dataSource  
  42.   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  43.     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  44.     <property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/>  
  45.     <property name="username" value="scott"/>  
  46.     <property name="password" value="tiger"/>  
  47.   </bean>  
  48.     
  49. </beans>  

Spring中对事务管理的底层实现

以上的方法,选用了Spring本身自带的JDBC的事务控制器做处理。

相关代码集中在DataSourceTransactionManager中

比如,事务的取得并且将取得的事务捆绑进当前线程中

  1. @Override  
  2.     protected Object doGetTransaction() {  
  3.         DataSourceTransactionObject txObject = new DataSourceTransactionObject();  
  4.         txObject.setSavepointAllowed(isNestedTransactionAllowed());  
  5.         ConnectionHolder conHolder =  
  6.             (ConnectionHolder) TransactionSynchronizationManager.getResource(this.dataSource);  
  7.         txObject.setConnectionHolder(conHolder, false);  
  8.         return txObject;  
  9.     }  

在比如事务的开始,

  1. /** 
  2.      * This implementation sets the isolation level but ignores the timeout. 
  3.      */  
  4.     @Override  
  5.     protected void doBegin(Object transaction, TransactionDefinition definition) {  
  6.         DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;  
  7.         Connection con = null;  
  8.   
  9.         try {  
  10.             if (txObject.getConnectionHolder() == null ||  
  11.                     txObject.getConnectionHolder().isSynchronizedWithTransaction()) {  
  12.                 Connection newCon = this.dataSource.getConnection();  
  13.                 if (logger.isDebugEnabled()) {  
  14.                     logger.debug("Acquired Connection [" + newCon + "] for JDBC transaction");  
  15.                 }  
  16.                 txObject.setConnectionHolder(new ConnectionHolder(newCon), true);  
  17.             }  
  18.   
  19.             txObject.getConnectionHolder().setSynchronizedWithTransaction(true);  
  20.             con = txObject.getConnectionHolder().getConnection();  
  21.   
  22.             Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);  
  23.             txObject.setPreviousIsolationLevel(previousIsolationLevel);  
  24.   
  25.             // Switch to manual commit if necessary. This is very expensive in some JDBC drivers,  
  26.             // so we don't want to do it unnecessarily (for example if we've explicitly  
  27.             // configured the connection pool to set it already).  
  28.             if (con.getAutoCommit()) {  
  29.                 txObject.setMustRestoreAutoCommit(true);  
  30.                 if (logger.isDebugEnabled()) {  
  31.                     logger.debug("Switching JDBC Connection [" + con + "] to manual commit");  
  32.                 }  
  33.                 con.setAutoCommit(false);  
  34.             }  
  35.             txObject.getConnectionHolder().setTransactionActive(true);  
  36.   
  37.             int timeout = determineTimeout(definition);  
  38.             if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) {  
  39.                 txObject.getConnectionHolder().setTimeoutInSeconds(timeout);  
  40.             }  
  41.   
  42.             // Bind the session holder to the thread.  
  43.             if (txObject.isNewConnectionHolder()) {  
  44.                 TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder());  
  45.             }  
  46.         }  
  47.   
  48.         catch (Exception ex) {  
  49.             DataSourceUtils.releaseConnection(con, this.dataSource);  
  50.             throw new CannotCreateTransactionException("Could not open JDBC Connection for transaction", ex);  
  51.         }  
  52.     }  

 

等等这里就不多说了,起个头,自己研究

分享到:
评论

相关推荐

    浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 SpringBoot之事务处理机制是Spring框架中的一种机制,用于管理事务。事务是指一系列的数据库操作,例如插入、更新、删除等,事务处理机制的目的就是为了确保这些操作的原子性、一致性...

    浅谈Spring+Hibernate整合(共16页).doc

    此外,Spring 还支持使用 AOP 来进行事务管理,通过 TransactionProxyFactoryBean 创建事务代理,实现事务的声明式管理,这样事务的边界逻辑被封装在事务拦截器中,业务代码更简洁,降低了耦合度。 Spring 的事务...

    浅谈Spring事务传播行为实战

    浅谈Spring事务传播行为实战 Spring框架提供了事务管理的标准实现,通过注解或者XML文件的方式声明和配置事务。事务管理是指按照给定的事务规则来执行事务的提交或者回滚操作。事务的机制实现很大一部依赖事务日志...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

    浅谈Spring Data如何简化数据操作的方法

    在实际应用中,例如使用MySQL数据库,开发者还需要在`applicationContext.xml`中配置数据源、JPA属性和事务管理器等。配置完成后,Spring Data将自动管理数据库连接,处理事务,并提供数据访问对象(DAO)的自动创建...

    浅谈Spring的两种事务定义方式

    浅谈Spring的两种事务定义方式 Spring框架提供了两种事务定义方式:声明式和注解式。下面我们将深入探讨这两种方式的实现和应用。 声明式事务 声明式事务是通过在XML文件中定义需要拦截方法的匹配来完成配置的。...

    浅谈MyBatis 事务管理

    浅谈MyBatis事务管理 MyBatis是一款优秀的持久层框架,它提供了强大的事务管理机制,帮助开发者轻松地管理数据库事务。在这篇文章中,我们将深入探讨MyBatis的事务管理机制,了解它的运行环境、事务抽象、事务管理...

    浅谈spring中isolation和propagation的用法

    浅谈Spring中isolation和propagation的用法 在Spring中,isolation和propagation是两个非常重要的概念,它们都是事务管理的核心组件。事务管理是指在数据库中执行一系列操作,以确保数据的一致性和完整性。在Spring...

    浅谈SSH学习要点

    在进阶阶段,Spring与Struts和Hibernate的整合是提升整体应用效能的关键,例如通过Spring管理Struts的Action和Hibernate的SessionFactory,实现统一的事务管理,这样不仅可以减少代码量,还能增强系统的稳定性和可...

    浅谈Springboot之于Spring的优势

    浅谈Springboot之于Spring的优势 ...同时,也欢迎各位参阅本站其他相关专题,如Spring的编程式事务和声明式事务详解、Spring spel表达式使用方法示例、浅谈Spring Boot微服务项目的推荐部署方式等。

    浅谈J2EE框架和分布式网络管理.pdf

    3. 强大的事务管理:在网络管理过程中,J2EE提供的事务管理保证了数据的一致性和完整性。 4. 安全性:J2EE提供了多种安全机制,确保网络管理和数据传输的安全性,如认证授权、SSL加密等。 总结而言,J2EE框架以其...

    浅谈java代理机制 .txt

    ### 浅谈Java代理机制 #### 一、引言 在深入探讨Java代理机制之前,我们首先需要了解代理模式的基本概念及其应用场景。代理模式是一种结构型设计模式,它为其他对象提供了一种代理以控制对这个对象的访问。在Java...

    浅谈Java技术中的数据库应用

    在Web环境中,Java可以无缝地集成到基于Servlet和JSP的Web应用框架中,如Spring框架,提供了一套完整的事务管理、数据访问和持久化策略,简化了数据库应用的开发和维护。 在Java 2及后续版本中,JDBC得到了进一步的...

    浅谈Java语言评价胜出的8大技术优势

    ### 浅谈Java语言评价胜出的8大技术优势 #### 1. 强大的API支持 Java提供了非常丰富的API支持,包括网络编程中的Socket API、数据库操作中的SQL API、图形用户界面的Swing和AWT API等。这些API不仅功能强大而且...

    浅谈SpringMVC+Spring3+Hibernate4开发环境搭建

    Spring3是Spring框架的一个版本,它提供了依赖注入、AOP(面向切面编程)、事务管理等功能,使得开发者可以更加专注于业务逻辑而不是底层实现。在配置中,我们通常会创建一个`contextConfigLocation`参数,指向...

    浅谈计算机软件开发中JAVA编程语言的应用.zip

    Spring框架是另一个广泛使用的Java企业级开发框架,它简化了依赖注入、事务管理、数据访问等功能,提高了开发效率。 三、Web应用开发 Java的Servlet和JSP技术是开发Web应用程序的基础。Servlet处理HTTP请求,而JSP...

    浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题

    在Spring框架中,多数据源的管理是一个常见的需求,特别是在大型分布式系统中,可能需要连接多个数据库以满足不同业务场景。Spring提供了一种灵活的解决方案,即`AbstractRoutingDataSource`,它允许我们在运行时...

    JAVA开发疑难问题汇总

    资源名称:JAVA开发疑难问题汇总资源目录:【】10年程序员生涯总结:从C 到Java的几...Java7新特性:自动化资源管理【】JavaEE进阶之Spring事务深入浅出【】 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

Global site tag (gtag.js) - Google Analytics