`
rysh0818
  • 浏览: 23832 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

spring事务管理器设计思想(二)

 
阅读更多

上文见《spring事务管理器设计思想(一)》

对于第二个问题,涉及到事务的传播级别,定义如下:

PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS-- 如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY-- 如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

在开启事务之前,正常情况下需要做两个事情

一:获取当前事务上下文信息

二:获取将要开启事务的传播属性

根据以上两个信息,来判断程序的处理方式,具体方式如下:

而处理流程则是如下:

其中上图标中英文简称对应的事务传播属性如下:

RE: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务。这是最常见的选择。

SPT PROPAGATION_SUPPORTS-- 如果当前没有事务,就以非事务方式执行。
MA: PROPAGATION_MANDATORY-- 如果当前没有事务,就抛出异常。
RE_NEW: PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
NOT_SPT: PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER: PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

通过上面发现,只有新创建资源的时候,才会开启事务,在其他的情况下,只需要返回事务状态信息就可以了。其实这个状态信息,就是事务的上下文信息。

事务上下文

通过上面的分析,每次启动事务的时候,都会判断当前是否存在事务,要么抛出异常,否则都会创新事务上下文,但是对于数据源的处理方式则是不一样的,这个要根据当前事务传播属性和新的事务传播属性共同决定。

事务上下文信息到底是什么,这个完全是可以自定义的,在spring中,主要是表现为TransactionStatus,也就是事务状态信息。里面保存了事务相关的信息,

//事务对象信息,使用普通数据源的话,是DataSourceTransactionObject对象,保存//了事务对应的连接信息

private final Object transaction;

//是否是新开启的事务信息,只有调用了开启事务的方法,这个才为true

private final boolean newTransaction;

//这个是事务同步器,不是事务要关心的,spring在事务提交之前或者之后座的hook

private final boolean newSynchronization;

//是否是只读事务

private final boolean readOnly;

//日志debug信息,完全没有放在这里

private final boolean debug;

//挂起的事务信息,如果没有,则为空

private final Object suspendedResources;

通过事务状态信息,就可以完全知道当前事务的所有信息,包括事务的对应的数据源连接信息,是否是新创建的事务,是否是只读事务,以及之前挂起的事务信息。这些对事务管理器起来说,都是必须的信息。但是个人觉得也存在一些问题,首先spring这个事务状态信息有两个使用者,一个是spring本身事务管理器使用,另外一个是应用程序接口。对应用程序接口暴露出来的状态信息以及内部使用的事务上下文信息应该隔离出来,避免应用程序人为的修改了事务上下文的属性信息。当然,可以用过接口的方式进行避免,但是如果知道实现原理的话,完全可以通过强制转化为实现对象,从而破坏事务其他的信息导致程序异常。当然,正常情况下不太可能有人会如此无聊。

从上面的分析来看,spring的事务管理器(这里都特指DataSourceTransactionManager)主要的工作流程就是创建事务信息,绑定数据源,获取数据库连接,提交活回滚事务,释放数据库连接,解绑数据源。其实整个事务管理器做的事情无非就是这些。让应用者更关注业务逻辑,而不是复杂的事务管理。

DataSourceTransactionManager事务管理器本身实现了ResouceManager的功能,就是返回对应的其注册的datasrouce。这是一种一对一的映射关系,也就是说一个事务管理器只能注册一个数据源,不支持多数据源的管理。一旦事务管理器开启事务,就和具体的数据源绑定了,你只能通过其对应的数据源获取数据库连接。所以在事务上下文里面操作多个数据库,是不可能的。同时也只支持单一物理数据源,也就是说一个数据源只能返回同一个数据库连接,不支持在同一个事务里面通过同一个逻辑数据源跨越多个物理库操作。下面的操作想通过ProxyDataSource切换实际的数据源的方式无法实现的。

for(String dbName : dbNames){

             DataSourceContextHolder.set(“dbName”);

             doSomeThing();

            DataSourceContextHolder.clear();

}

想要支持跨库的事务操作,可以通过以下几种方式操作:

1 使用JtaTransactionManager,通过jta服务提供商来实现跨库事务

2 改写ProxyDataSource,通过返回其自己实现的Connection来实现跨库的事务。简单的说,返回一个逻辑的Connection,这个connection本身持有多个物理connection

3 自己实现TransactionManager,可以注册多个资源管理器,自己对多个数据源进行管理。

事务上下文的扩展

正常情通过况下,事务上下文信息都是保存在内存之中,相当于只能够支持单个jvm。可以想象一下,假设事务管理器把事务上下文信息持久化,并且通过远程调用的方式,把事务上下文信息传递给另外一个jvm,通过这样的设计思想,可以支持跨jvm间的事务一致性,也就是我们所说的分布式系统的事务。当然,这只是一中简单的想法,具体的实现会相当复杂,需要考虑点也有很多。

分享到:
评论

相关推荐

    Spring设计思想.ppt

    这样做的好处是降低了内存中对象的创建和销毁的开销,尤其是对于那些状态不随时间改变或者需要全局唯一性的对象,如数据源、事务管理器等,单态模式能显著提高系统性能。Spring通过控制bean的生命周期,自动管理其...

    Spring框架的事务管理应用分析.doc

    - **统一的事务策略**:Spring事务管理支持JDBC、Hibernate、JPA等多种数据访问技术,提供了一致的事务处理方式。 - **灵活性**:可以选择编程式或声明式事务管理,根据项目需求调整事务控制粒度。 - **异常传播**:...

    SpringBoot事务和Spring事务详讲

    这意味着开发者无需显式地定义这些事务管理器,Spring Boot 会根据应用中使用的持久化技术自动选择合适的事务管理器。 ##### 2. 注解驱动 Spring Boot 支持使用注解来控制事务的传播行为。例如,通过在方法上使用 `...

    aop与spring事务处理

    ### AOP与Spring事务处理详解 ...AOP 能够有效地将横切关注点从业务逻辑中分离出来,而Spring事务管理则为开发者提供了简单、灵活的方式来管理事务。这两种技术相结合,能够显著提高软件的质量和开发效率。

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)+.pdf

    Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中,声明式事务管理更加简洁易用,通常通过XML或注解的方式配置事务规则。 ### 其他高级特性 除了上述基础特性之外,Spring框架还包含了众多...

    Spring_框架的设计理念与设计模式分析

    Spring的核心设计思想之一是面向Bean的编程(BOP)。Bean是Spring框架中的核心概念,它封装了应用程序中的对象和服务。Spring通过管理这些Bean来实现对应用逻辑的支持,包括但不限于依赖注入、生命周期管理等功能。...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    4. **事务管理**:Spring提供了声明式事务管理功能,使得事务管理变得更加简单易用。 5. **MVC框架**:Spring的Web MVC框架是一种高度可配置的模型-视图-控制器框架,用于构建Web应用程序。 ### Spring架构分析 ...

    Spring框架的设计理念与设计模式分析

    6. **策略模式**:Spring的事务管理策略,允许开发者选择不同的事务管理方式,如编程式事务管理、声明式事务管理等。 7. **适配器模式**:Spring通过适配器将不同来源的数据源(如JDBC、Hibernate、MyBatis等)统一...

    spring的核心思想

    它提供了全面的基础架构支持,包括但不限于依赖注入(Dependency Injection,简称DI)、面向切面编程(Aspect Oriented Programming,简称AOP)、数据访问/集成(Data Access/Integration)、事务管理(Transaction ...

    Spring框架的设计理念与设计模式分析之一

    3. **AOP的支持**:Spring框架内置了对AOP的支持,可以方便地实现诸如日志记录、安全控制、事务管理等功能,而无需显式编写代码。 #### 四、核心组件如何协同工作 1. **Bean组件**:Bean组件负责定义Bean的结构、...

    Spring技术内幕:深入解析Spring架构与设计原理

    总的来说,《Spring技术内幕:深入解析Spring架构与设计原理》是一本全面而深入的Spring指南,旨在帮助读者不仅掌握Spring的使用,更能理解其设计思想和实现原理,从而在实际开发中更加得心应手。通过阅读这本书,...

    spring核心思想

    AOP允许将关注点(如日志、事务管理、安全性)从核心业务逻辑中分离出来,形成独立的切面。在运行时,这些切面可以像织入一样插入到业务代码中。Spring提供了两种实现AOP的方式:基于代理的AOP(使用JDK动态代理或...

    SPRING技术内幕:深入解析SPRING架构与设计原理.pdf 下载

    Spring框架内置了对AOP的支持,允许开发者以声明式的方式实现横切关注点,如事务管理和日志记录等。这种机制能够将业务逻辑和系统服务分离,提高了代码的可维护性和可读性。 ### 四、Spring框架的优势 1. **非侵入...

    深入剖析Spring Web源码(含一二版)带目录

    - **Spring事务管理**:了解声明式和编程式事务管理,以及事务的传播行为。 - **Spring MVC工作流程**:从HTTP请求到响应,分析DispatcherServlet、HandlerMapping、HandlerAdapter、ModelAndView等组件的作用。 ...

    Spring源码解析.zip

    Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现原理一直是许多开发者深入研究的重点。本压缩包“Spring源码解析”提供了对Spring框架核心组件——IOC(Inversion of Control,控制反转)、AOP...

    (源码)基于SpringCloudNetflix的分布式事务管理系统.zip

    采用TCC设计思想,通过TryConfirmCancel三个阶段实现分布式事务管理。 通过HTTP协议进行服务间的事务协调,确保事务的一致性和可靠性。 2. 服务治理 使用Spring Cloud Netflix进行服务注册与发现,实现微服务间...

    84丨开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则1

    例如,Spring的事务管理功能,通过声明式事务管理,开发者无需关心事务的开启、提交和回滚,只需在方法上添加注解即可。 通过以上设计思想的实践,Spring框架不仅提高了开发效率,还增强了系统的可扩展性和可维护性...

Global site tag (gtag.js) - Google Analytics