简介
spring 提供了全面的事务支持,提供了统一的事务管理器接口(PlatformTransactionManager),事务的提交、回滚等操作都是由它来完成。 spring 的事务体系都是基于 PlatformTransactionManager 。
getTransaction 分析
我们可以看到,核心接口
- TransactionDefinition
事务的隔离级别是数据库提供的属性,事务的传播属性是spring 为为我们提供的功能。对于数据库,是没有传播属性这个概念的。
DefaultTransactionStatus 通过上面我们可以看到,事务是一个 Object 对象,事务的提交和回滚都会依赖这个对象,这是因为各家对于事务的实现不同,比如数据库是基于 connection 、 hibernate 是基于 自已定义的 transaction 来实现的。我们来看一下该对象的赋值情况,进一步分析
*
我们使用DataSource 获取连接,要想实现事务功能,需要使用 connection , DataSourceTransactionObject 中有一个 ConnectionHolder,他封装了一个Connection
正如前面提到的,各家对于事务支持的实现不同,spring 提供对应的 *Holder 来支持对应的资源,我们来看一下下面的这个,进一步确认
通过上面的流程,我们看到了 spring 向对应的 Holder 获取一个 Object ,对应的事务实现通过这个 Object 来实现。 下面我们来看一下具体的 getTransaction 实现。
通过源码,我们可以发现,总的可以分为上面几个部分:
- 1.判断是否已存在事务,如果存在事务,对已存在的事务创建一个 TransactionStatus
- 2.验证事务是否超时
- 3.根据事务传播属性,处理事务
- 通过给定的事务对象,判断是否已经存在事务(即事务已开启)。判断的结果依赖于给定事务的传播属性
- 该方法是 AbstractPlatformTransactionManager 给出的默认实现,他的具体实现是由自己特定的事务管理器实现,比如:DataSourceTransactionManager
下面我们来进一步分析上面的两个方法块
- 根据给定的事务定义开启一个新的事务。当事务管理器决定调用该方法的时候,要么事之前没有任何事务,要么事之前的事务已经被暂停。所以该方法不关心应用的传播行为
- 该方法是 AbstractPlatformTransactionManager 给出的默认实现,他的具体实现由自己特定的事务管理器实现,比如:DataSourceTransactionManager
通过事务同步管理器创建一个事务同步,我们现在看一下这个事务同步管理器
- Central delegate that manages resources and transaction synchronizations per thread. 是一个核心代理,为每个线程管理资源和事务同步