spring 事务再理解

spring 事务再理解

Posted by lijian on March 27, 2019

spring 事务官网文档

简介

spring 提供了全面的事务支持,提供了统一的事务管理器接口(PlatformTransactionManager),事务的提交、回滚等操作都是由它来完成。 spring 的事务体系都是基于 PlatformTransactionManager 。

20190327platformtransactionmanager.png

getTransaction 分析

我们可以看到,核心接口

  • TransactionDefinition

事务的隔离级别是数据库提供的属性,事务的传播属性是spring 为为我们提供的功能。对于数据库,是没有传播属性这个概念的。

20190327DefaultTransactionStatus.png

DefaultTransactionStatus 通过上面我们可以看到,事务是一个 Object 对象,事务的提交和回滚都会依赖这个对象,这是因为各家对于事务的实现不同,比如数据库是基于 connection 、 hibernate 是基于 自已定义的 transaction 来实现的。我们来看一下该对象的赋值情况,进一步分析

20190327DefaultTransactionStatus01.png * 20190327DefaultTransactionStatus02.png

  • 20190327DefaultTransactionStatus03.png
  • 20190327DefaultTransactionStatus04.png
  • 20190327DefaultTransactionStatus05.png
  • 20190327RabbitTransactionManager.png

我们使用DataSource 获取连接,要想实现事务功能,需要使用 connection , DataSourceTransactionObject 中有一个 ConnectionHolder,他封装了一个Connection

正如前面提到的,各家对于事务支持的实现不同,spring 提供对应的 *Holder 来支持对应的资源,我们来看一下下面的这个,进一步确认

20190327ResourceHorderSupport.png

通过上面的流程,我们看到了 spring 向对应的 Holder 获取一个 Object ,对应的事务实现通过这个 Object 来实现。 下面我们来看一下具体的 getTransaction 实现。

20190327getTransaction01.png

通过源码,我们可以发现,总的可以分为上面几个部分:

  • 1.判断是否已存在事务,如果存在事务,对已存在的事务创建一个 TransactionStatus
  • 2.验证事务是否超时
  • 3.根据事务传播属性,处理事务

20190327isExistingTransaction.png

  • 通过给定的事务对象,判断是否已经存在事务(即事务已开启)。判断的结果依赖于给定事务的传播属性
  • 该方法是 AbstractPlatformTransactionManager 给出的默认实现,他的具体实现是由自己特定的事务管理器实现,比如:DataSourceTransactionManager

20190327getTransaction02.png 下面我们来进一步分析上面的两个方法块

20190327doBegin.png

  • 根据给定的事务定义开启一个新的事务。当事务管理器决定调用该方法的时候,要么事之前没有任何事务,要么事之前的事务已经被暂停。所以该方法不关心应用的传播行为
  • 该方法是 AbstractPlatformTransactionManager 给出的默认实现,他的具体实现由自己特定的事务管理器实现,比如:DataSourceTransactionManager

20190327prepareSynchronization.png

通过事务同步管理器创建一个事务同步,我们现在看一下这个事务同步管理器

20190327TransactionSynchronizationManager.png

  • Central delegate that manages resources and transaction synchronizations per thread. 是一个核心代理,为每个线程管理资源和事务同步

事务抽象