Spring源码分析之Spring的事务管理

背景

Spring统一的事务管理方式非常的巧妙和有趣,为了一探究竟,我们来深入研究,探索一番,这里从源码级别来一层一层的拨开它简单操作下面的具体原理

PlatformTransactionManager

我们先来看一下关系类图
Spring源码分析之Spring的事务管理_第1张图片

Spring 为了方便事务的管理和统一,在PlatformTransactionManager中设计的内容非常的简单,只有三个方法。

Spring源码分析之Spring的事务管理_第2张图片
从方法名中我们可以看出,这个接口在顶层设计时需要完成的任务是什么,

  1. 根据事务定义信息获取事务;
  2. 通过事务状态信息提交事务;
  3. 通过事务状态信息回滚事务;

为了满足这三个任务,Spring设计时如何考虑的呢?这三个任务依赖了三个接口,分别是TransactionDefinition和TransactionStatus。下面我们具体来讲一下这些接口上设计的考虑

如何减少跟具体数据库的耦合性

PlatformTransactionManager在设计之初就考虑到对多平台的支持,那么首要一点就是不依赖具体的api,具体如何做,自己定义一套统一的接口来,然后在根据不同的平台实现不同得接口实现,在这里Spring通过TransactionDefinition定义了事务的元数据信息,其中包括这些内容我们来个类图来看一下。

Spring源码分析之Spring的事务管理_第3张图片
根据ACID的原则,事务具有原子性(Atomicity),一致性(consistency),隔离性(isolation),持久性(durability)。那么数据库或其他平台在实现事务时,根据事务的特性,
Spring抽象了以下属性,
事务的名称,
事务是否是只读,
事务的传播行为,
事务的隔离级别,
事务的超时时间。

5个属性概括了Spring平台中管理的事务特性,然后又通过5个final类型来具体化事务隔离级别的值,分别是,
默认值(直接用平台中的默认值),
读未提交(级别最低,读未提交),
读已提交(Oracle默认,避免脏读),
可重复读(MySQL默认的,避免脏读,不可重复读),
串行化(级别最高,避免重复读,脏读,幻读)。

这里简单的回顾了一下事务的定义和Spring抽象这个事务定义接口的内容,下面看一下
TransactionStatus

TransactionStatus

事务状态,我们看一下类图 。
Spring源码分析之Spring的事务管理_第4张图片

我们看到事务状态在Spring抽象的接口中包含了,3个方法,设置只回滚,检查是否有保存点,刷新到硬盘,有3个属性是否是新事物,是否只回滚,是否是完成的事务。Spring通过这三个抽象的接口所规划的内容来完成用Spring来统一事务的管理,下一篇我们来讲讲具体实现

你可能感兴趣的:(做技术的,小笔记,java,Spring)