Spring事务处理浅析

el/2024/4/13 15:15:08

类层次结构

在Spring的事务处理模块中.可以看到的类层次结构如图:

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

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

事务处理的实现过程

声明式事务处理的实现大致可以分为以下几个部分:

  • 读取和处理在IoC容器中配置的事务处理属性,并转化为Spring事务处理需要的内部数据结构。具体来说,这里涉及的类是TransactionAttributeSourceAdvisor,从名字可以看出,它是一个AOP通知器,Spring使用这个通知器来完成对事务处理属性值的处理。处理的结果是,在IoC容器中配置的事务处理属性信息,会被读入并转化成TransactionAttribute表示的数据对象,这个数据对象是Spring对事物处理属性值的数据抽象,对这些属性的处理是和TransactionProxyFactoryBean拦截下来的事务方法的处理结合起来的。

  • Spring事务处理模块实现统一的事务处理过程。这个通用的事务处理过程包含处理事务配置属性,以及与线程绑定完成事务处理的过程.Spring通过TransactioninfoTransactionStatus这两个数据对象,在事务处理过程中记录和传递相关执行场景。

  • 底层的事务处理实现。对于底层的事务操作,Spring委托给具体的事务处理器来完成,这些具体的事务处理器,就是在IoC容器中配置声明式事务处理时,配置的PlatformTransactionManager的具体实现,比如DataSourceTransactionManagerHibernateTransactionManager等。

具体的分析,这里就不说了,感兴趣的话可以以这个大致的思路去看源码。


http://www.ngui.cc/el/4466043.html

相关文章

dubbo管理控制台dubbo-admin安装

资源: dubbo源码 和 中文文档 下载源码 下载dubbo-admin模块代码,这个还真不太好找,可能是因为dubbo迁移至Apache 维护后,代码还没迁移好??? 我是在 https://github.com/apache/incubator-du…

React Native 项目环境配置、调试以及打包

去年在做React Native混合开发的时候,写过几篇笔记: react-native对android物理返回键back的监听以及基类封装 react native导航navigator react-native 与安卓端通信 android 端集成react native Fetch 网络请求简单封装,支持超时入口 …

Rest 概要

REST RESTful Representational State Transfer。是在因特网上提供计算机系统之间的互操作性的一种方式。基于Http协议的资源传递,包括JSON、XML和文本等。 统一接口 资源识别(Identification of resources) URI(Uniform Resou…

构建一个REST风格的Web服务

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将在以下地址构建一个将接受HTTP GET请求的服务: http://localhost:8080/greeting 会返回一个JSON 格式的数据: {"id":1,"content"…

调度任务Scheduling Tasks

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将构建一个应用程序&#xff0c;该应用程序使用Spring的 Scheduled 注解&#xff0c;每5秒打印一次当前时间。 构建步骤 1、添加maven依赖 <dependency><groupId>…

消费RESTful Web服务

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将构建一个使用Spring RestTemplate的应用程序来获取 http://gturnquist-quoters.cfapps.io/api/random 中的随机Spring Boot数据。 构建步骤 1、添加maven依赖&#xff1a; &l…

上传文件Uploading Files

你需要什么 大约15分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2 你会建立什么 您将创建一个接受文件上传的Spring Boot Web应用程序。您还将构建一个简单的HTML界面来上传测试文件。 构建步骤 1、添加maven依赖。 <dependency><groupId>org.spri…

Redis安装和常见问题解决

安装 redis 安装指令&#xff1a; yum install epel-release --下载fedora的epel仓库 yum install redis -- 安装redis数据库开启和关闭服务 redis 其他常用指令&#xff1a; redis-server /etc/redis.conf --开启redis服务 redis-cli -- 进入redis服…

使用Redis进行消息传递

你需要什么 大约 15 15 分钟IntelliJ IDEA或其他编辑器JDK 1.8或更高版本Maven 3.2Redis server 你会建立什么 您将构建一个使用StringRedisTemplate发布字符串消息的应用程序&#xff0c;并使用MessageListenerAdapter为其提供POJO订阅。 使用Spring Data Redis作为发布消…

thymeleaf 怎么降低对html的解析标准

正常情况下&#xff0c;如果不做任何配置的话&#xff0c;thymeleaf会以严格的html标准来要求html文件的标签以及js代码遵守规范。但是我们知道html代码是一种不是那么严格的语言&#xff0c;导致很多码农编码时并不是那么严格按照规范&#xff0c;比如<meta>、<link&…