Spring 与事务处理

简介: 《读尽源码》

在涉及单个数据库局部事务的事务处理中,事务的最终实现和数据库的支持是紧密相关的。对局部数据库事务来说,一个事务处理的操作单元往往对应着一系列的数据库操作。数据库产品对这些数据库的 SQL 操作 已经提供了原子性的支持,对 SQL 操作 而言,它的操作结果有两种: 一种是提交成功,数据库操作成功;另一种是回滚,数据库操作不成功,恢复到操作以前的状态。

在事务处理中,事务处理单元的设计与相应的业务逻辑设计有很紧密的联系。在很多情况下,一个业务逻辑处理不会只有一个单独的数据库操作,而是有一组数据库操作。在这个处理过程中,首先涉及的是事务处理单元划分的问题,Spring 借助 IoC 容器 的强大配置能力,为应用提供了声明式的事务划分方式,这种声明式的事务处理,为 Spring 应用 使用事务管理提供了统一的方式。有了 Spring 事务管理 的支持,只需要通过一些简单的配置,应用就能完成复杂的事务处理工作,从而为用户使用事务处理提供很大的方便。

1 Spring 事务处理的设计概览

Spring 事务处理模块的类层次结构如下图所示。

1.png

从上图可以看到,Spring 事务处理模块 是通过 AOP 功能 来实现声明式事务处理的,比如事务属性的配置和读取,事务对象的抽象等。因此,在 Spring 事务处理 中,可以通过设计一个 TransactionProxyFactoryBean 来使用 AOP 功能,通过这个 TransactionProxyFactoryBean 可以生成 Proxy 代理对象,在这个代理对象中,通过 TransactionInterceptor 来完成对代理方法的拦截,正是这些 AOP 的拦截功能,将事务处理的功能编织进来。

对于具体的事务处理实现,比如事务的生成、提交、回滚、挂起等,由于不同的底层数据库有不同的支持方式,因此,在 Spring 事务处理中,对主要的事务实现做了一个抽象和适配。适配的具体事务处理器包括:对 DataSource 数据源 的事务处理支持,对 Hibernate 数据源 的事务处理支持,对 JDO 数据源 的事务处理支持,对 JPA 和 JTA 等数据源的事务处理支持等。这一系列的事务处理支持,都是通过设计 PlatformTransactionManager、AbstractPlatformTransactionManager 以及一系列具体事务处理器来实现的,而 PlatformTransactionManager 又实现了 TransactionInterceptor 接口,通过这样一个接口实现设计,就把这一系列的事务处理的实现与前面提到的 TransactionProxyFactoryBean 结合起来,从而形成了一个 Spring 声明式事务处理 的设计体系。

2 Spring 事务处理 的应用场景

Spring 作为应用平台或框架的设计出发点是支持 POJO 的开发,这点在实现事务处理的时候也不例外。在 Spring 中,它既支持编程式事务管理方式,又支持声明式事务处理方式,在使用 Spring 处理事务的时候,声明式事务处理通常比编程式事务管理更方便些。

Spring 对应用的支持,一方面,通过声明式事务处理,将事务处理的过程和业务代码分离出来。这种声明方式实际上是通过 AOP 的方式来完成的。显然,Spring 已经把那些通用的事务处理过程抽象出来,并通过 AOP 的方式进行封装,然后用声明式的使用方式交付给客户使用。这样,应用程序可以更简单地管理事务,并且只需要关注事务的处理策略。另一方面,应用在选择数据源时可能会采取不同的方案,当以 Spring 作为平台时,Spring 在应用和具体的数据源之间,搭建一个中间平台,通过这个中间平台,解耦应用和具体数据源之间的绑定,并且,Spring 为常用的数据源的事务处理支持提供了一系列的 TransactionManager。这些 Spring 封装好的 TransactionManager 为应用提供了很大的方便,因为在这些具体事务处理过程中,已经根据底层的实现,封装好了事务处理的设置以及与特定数据源相关的特定事务处理过程,这样应用在使用不同的数据源时,可以做到事务处理的即开即用。这样的另一个好处是,如果应用有其他的数据源事务处理需要, Spring 也提供了一种一致的方式。这种 有机的事务过程抽象 和 具体的事务处理 相结合的设计,是我们在日常的开发中非常需要模仿学习的。

相关文章
|
6月前
|
Java 数据库 Spring
Spring 事务
Spring 事务
44 1
|
XML Java 关系型数据库
spring6-事务
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
94 0
spring6-事务
|
6月前
|
Java 程序员 数据库连接
Spring之事务(1)
【1月更文挑战第16天】 一、JdbcTemplate 1、简介 2、准备工作 3、实现CURD ①装配 JdbcTemplate ②测试增删改功能 ③查询数据返回对象 ④查询数据返回list集合 ⑤查询返回单个的值 二、声明式事务概念 1、事务基本概念 ①什么是事务 ②事务的特性 2、编程式事务 3、声明式事务
144 3
|
6月前
|
XML Java 数据库
Spring之事务(2)
【1月更文挑战第16天】 一、基于注解的声明式事务 1、准备工作 2、测试无事务情况 3、加入事务 ①添加事务配置 ②添加事务注解 ③观察结果 4、@Transactional注解标识的位置 5、事务属性:只读 6、事务属性:超时 7、事务属性:回滚策略 8、事务属性:隔离级别 9、事务属性:传播行为 10、全注解配置事务 二、基于XML的声明式事务 1、场景模拟 2、修改Spring配置文件
73 1
|
6月前
|
SQL Java 关系型数据库
Spring的事务详解
Spring的事务详解
80 0
Spring的事务详解
|
Java 数据库连接 API
Spring中的事务处理机制详解
Spring中的事务处理机制详解
197 0
|
Java 数据库连接 数据库
Spring | 事务
Spring | 事务
105 0
|
SQL Java 关系型数据库
Spring之事务
Spring之事务
111 0
|
SQL Java 数据库连接
Spring 与事务处理
《基础系列》
97 0
Spring 与事务处理
|
SQL 设计模式 Java
Spring 事务设计与实现
前言 很多人都知道 Spring 包含声明式与编程式两种事务管理方式,通常来说这已经足够日常使用 Spring 事务了。然而,要掌握一门技术,我们还要关心这门技术出现的背景,解决了什么问题,Spring 的事务设计也有其历史原因。
187 1