`
whitesock
  • 浏览: 483735 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Spring Transaction

阅读更多

Spring的局部事务管理策略是基于PlatformTransactionManager(PTM)的, 这个接口比较单纯, 只有如下三个方法.
    TransactionStatus getTransaction(TransactionDefinition definition) throws  TransactionException;
    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;

    设想有个Service(A), 它采用声明式事务, 事务传播行为是PROPAGATION_REQUIRED. 同时使用DataSourceTransactionManager(DTM)作为事务管理器. 那么在调用Service(A)之前, TransactionInterceptor会构造TransactionInfo(A), 并把它绑定到当前线程上, 同时调用DTM.getTransaction方法, 以下是DTM.getTransaction方法调用完毕后一种可能的事务状态.
TransactionInfo(A)
  |->oldTransactionInfo = null
  |->TransactionStatus(A)
         |->newTransaction=true
         |->savepoint=null
         |->DataSourceTransactionObject(A)
                |->newConnectionHolder=true
                |->SuspendedResourcesHolder(A)
                |      |->suspendedResources=null
                |->ConnectionHolder(A)
                       |->connectionHandle=SimpleConnectionHandle(dataSource.getConnection())
                       |->transactionActive=true

    假设在Service(A)中调用了Service(B), 它的事务传播行为也是PROPAGATION_REQUIRED. 以下是为Service(B)调用了DTM.getTransaction方法后一种可能的事务状态.
TransactionInfo(B)
  |->oldTransactionInfo=TransactionInfo(A)
  |->TransactionStatus(B)
         |->newTransaction=false
         |->savepoint=null
         |->DataSourceTransactionObject(B)
                |->newConnectionHolder=false
                |->SuspendedResourcesHolder(B)
                |      |->suspendedResources=null
                |->ConnectionHolder(A)
    TransactionInfo(A)和TransactionInfo(B)是绑定到当前线程的, 而且从以上两个状态描述中可以看出来, TransactionInfo采用了单向链表结构, 表头永远是当前堆栈栈顶的方法对应的TransactionInfo对象. 由于Service(A)和Service(B)的事务传播行为都是PROPAGATION_REQUIRED, 所以TransactionStatus(B)的newTransaction属性是false, 也就是在对Service(B)的调用中并没有开启新的事务. 同时DataSourceTransactionObject(B)的ConnectionHolder引用是指向ConnectionHolder(A)的, 也就是说在Service(B)中将和Service(A)使用同一个JDBC连接.

    假设在Service(A)中调用了Service(B), 它的事务传播行为是PROPAGATION_REQUIRE_NEW. 以下是为Service(B)调用了DTM.getTransaction方法后一种可能的事务状态.
TransactionInfo(B)
  |->oldTransactionInfo=TransactionInfo(A)
  |->TransactionStatus(B)
         |->newTransaction=true
         |->savepoint=null
         |->DataSourceTransactionObject(B)
                |->newConnectionHolder=true
                |->SuspendedResourcesHolder(B)
                |      |->suspendedResources=ConnectionHolder(A)
                |->ConnectionHolder(B)
                       |->connectionHandle=SimpleConnectionHandle(dataSource.getConnection())
                       |->transactionActive=true
    由于Service(B)的事务传播行为是PROPAGATION_REQUIRE_NEW, 那么Service(A)的事务将被挂起, 在SuspendedResourcesHolder(B)的suspendedResources属性中保存了被挂起的ConnectionHolder(A). ConnectionHolder(B)也不再指向ConnectionHolder(A), 而是获得一个新的JDBC连接, 同时DTM会把ConnectionHolder(B)绑定到当前线程上. 这意味着Service(B)的事务会在一个不同于Service(A)的JDBC连接中进行. 直到Service(B)方法执行完毕后, DTM会把ConnectionHolder(A)重新绑定到当前线程上, 也就是说接下来的Service(A)方法中仍然会使用ConnectionHolder(A)中保存的JDBC连接.

    如果Service(B)的事务传播行为是PROPAGATION_NOT_SUPPORTED, 那么Service(A)的事务将被挂起, 同时DTM会解除当前线程上ConnectionHolder(A)的绑定. 但是并不会获得一个新的JDBC连接(因为不需要为ServiceB开启事务, 同时TransactionStatus(B)的newTransaction属性是false). 但是如果在Service(B)中使用了DataSourceUtils.getConnection()方法, 那么在Service(B)中会获得一个新的JDBC连接, 并绑定一个新的ConnectionHolder到当前线程上.

    如果Service(B)的事务传播行为是PROPAGATION_NESTED, 那么会开启一个嵌套事务. 首先引用一下Juergen Hoeller关于嵌套事务的描述:
PROPAGATION_NESTED on the other hand starts a "nested" transaction, which is a true subtransaction of the existing one. What will happen is that a savepoint will be taken at the start of the nested transaction. íf the nested transaction fails, we will roll back to that savepoint. The nested transaction is part of of the outer transaction, so it will only be committed at the end of of the outer transaction.
Nested transactions essentially allow to try some execution subpaths as subtransactions: rolling back to the state at the beginning of the failed subpath, continuing with another subpath or with the main execution path there - all within one isolated transaction, and not losing any previous work done within the outer transaction.
    也就是说, 嵌套事务和外层事务使用的是同一个JDBC连接上的事务, 嵌套事务伴随着外层事务的提交而提交, 如果嵌套事务rollback, 那么嵌套事务会回滚到嵌套事务开启时的Save Point处, 而外层事务不受影响. 因此嵌套事务需要支持JDBC 3.0 Save Point特性的数据库以及JDBC驱动程序(用con.getMetaData().supportsSavepoints()判断, MySql5.1支持). 以下是为Service(B)调用了DTM.getTransaction方法调用完毕后相关的事务状态. 其中TransactionStatus(B)的savepoint属性保存了con.setSavepoint()返回的Savepoint对象.
TransactionInfo(B)
  |->oldTransactionInfo=TransactionInfo(A)
  |->TransactionStatus(B)
         |->newTransaction=false
         |->savepoint=Savepoint(B)
         |->DataSourceTransactionObject(B)
                |->newConnectionHolder=false
                |->SuspendedResourcesHolder(B)
                |      |->suspendedResources=null
                |->ConnectionHolder(A)

 

11
2
分享到:
评论
2 楼 Technoboy 2011-10-27  
看了无数遍,终于彻底的明白了,徐师傅,佩服
1 楼 cymya 2008-10-31  
写的不错,有深度,很是羡慕你的理解能力

相关推荐

    springTransaction.rar

    这个名为"springTransaction.rar"的压缩包文件包含了一个关于Spring事务管理的小型示例,旨在演示如何使用Spring的事务传播机制来处理数据库操作,特别是转账功能的实现。 首先,让我们了解一下什么是事务。在...

    springtransaction 事务管理

    在实际项目中,`springtransaction`工程可能是包含了一个完整的示例,用于演示如何在MyEclipse环境中配置和使用Spring的事务管理功能。开发者可以通过导入此工程,学习和实践Spring事务管理的配置与使用,从而更好地...

    spring-transaction.jar.zip

    "spring-transaction.jar"正是提供了Spring事务管理的类库,它包含了一系列用于处理事务的接口、类和配置元素,使得开发者能够方便地实现事务控制。 一、Spring 事务管理概述 Spring事务管理分为编程式事务管理和...

    Spring 常用 Transaction Annotation

    本篇主要聚焦于"Spring 常用 Transaction Annotation",即声明式事务管理,这是一种更简洁、易于维护的事务控制方式。 首先,Spring的声明式事务管理基于AOP(面向切面编程),它允许我们在不修改业务代码的情况下...

    Spring攻略(第三版)源代码

    12. Spring Transaction Management 13. Spring Batch 14. Spring NoSQL and Big Data 15. Spring Java Enterprise Services and Remoting Technologies 16. Spring Messaging 17. Spring Integration 18. Spring ...

    SimpleSpringMVCWithTxSupport:使用 Spring Transaction 支持的简单 Spring MVC 应用程序

    使用 Spring Transaction 支持的简单 Spring MVC 应用程序,带有 @Transactional 注释和 JPA。 配置为与 Weblogic 事务管理器集成。 此示例应用程序仅用作配置了 Spring Transaction 支持的 Spring MVC 应用程序的...

    org.springframework.transaction-3.2.2.RELEASE

    org.springframework.transaction-3.2.2.RELEASE最新版本

    Spring在Transaction事务传播行为种类

    ### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...

    spring类库 spring类库

    6. **Spring Transaction**:事务管理模块提供了声明式和编程式的事务管理,确保了在分布式环境下的数据一致性。 7. **Spring Aspects**:此模块提供了AOP的扩展,支持自定义切面和通知类型,增强了Spring的面向切...

    Spring事务管理的jar包

    在Java企业级应用开发中,Spring框架以其强大的功能和灵活性被广泛应用,特别是在事务管理方面。Spring提供了全面的事务管理解决方案,使得开发者可以方便地控制事务的边界,保证数据的一致性和完整性。本篇将深入...

    spring核心jar包

    7. **Spring Transaction**: 提供了一致的事务管理接口,支持编程式和声明式事务管理。这使得事务管理可以跨不同的数据访问技术进行。 8. **Spring MVC**: 是Spring提供的用于构建Web应用的模型-视图-控制器(Model...

    Spring3_jar.zip

    SpringTransaction是Spring框架的事务管理模块,它提供了一种声明式和编程式的事务管理方式。声明式事务管理允许我们在配置文件中定义事务边界,而无需在代码中显式控制事务开始和结束。编程式事务管理则通过...

    spring4.0完整jar包

    6. **Spring Transaction**:提供了一种声明式和编程式事务管理机制,可以在多个数据库操作之间确保数据的一致性。 7. **Spring Web**:针对Web开发的模块,包含Spring MVC(Model-View-Controller)和Spring ...

    spring 4.1 jar包

    3. **Spring Transaction** (spring-tx-4.1.6.RELEASE.jar): 事务管理是Spring的核心功能之一,它允许开发者声明性地管理事务,提供编程式和声明式的事务处理,支持多种事务API如JTA、JDBC、Hibernate等。...

    spring jar 包详解

    - **功能简介**:包含了 Spring DAO、Spring Transaction 进行数据访问的所有类。 - **应用场景**:适用于需要进行数据访问操作的项目。 - **依赖关系**:依赖于 `spring-core.jar`、`spring-beans.jar`、`spring-...

    Spring Data JPA的优点和难点.pdf

    - Spring Data JPA可以无缝地与Spring Boot、Spring MVC、Spring Transaction管理等组件集成,为开发者提供了完整的解决方案,降低了系统的复杂性。 然而,尽管Spring Data JPA带来了诸多便利,但在实际使用中也会...

    笔者学习Spring4.3.7用到的jar包

    7. **Spring Transaction**:提供了统一的事务管理接口,无论是本地事务还是分布式事务,都能进行统一的管理和控制。`@Transactional`注解使得事务管理变得简单。 8. **Spring Aspects**:提供了AOP的实现,包括...

    spring recipe 英文版

    Spring Transaction Management 事务管理是保证数据一致性的重要手段,Spring 提供了全面的事务管理功能,可以方便地应用于不同的业务场景中。 #### 12. Spring Batch 对于需要处理大量数据的任务,Spring Batch...

    Spring事务管理和SpringJDBC思维导图

    在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...

    spring学习:spring data jpa

    6. **Integration with Spring Transaction Management**:Spring Data JPA与Spring的事务管理无缝集成,可以方便地进行事务控制。 在实际使用中,我们需要配置Spring Data JPA,这通常涉及到以下步骤: 1. 添加...

Global site tag (gtag.js) - Google Analytics