在spring的事务运行过程中,需要保存一些状态,涉及的一些对象如下
1. TransactionSynchronizationManager
2. SuspendedResourcesHolder
3. DefaultTransactionStatus
底层以JDBC DataSourceTransactionManager为例,状态对象
1. DataSourceTransactionObject
2. ConnectionHolder
下面逐一进行分析说明
TransactionSynchronizationManager-使用TreadLocal记录事务的一些属性,用于应用扩展同步器的使用,在事务的开启,挂起,提交等各个点上回调应用的逻辑
ThreadLocal<Map<Object, Object>> resources - 应用代码随事务的声明周期绑定的对象
ThreadLocal<Set<TransactionSynchronization>> synchronizations-使用的同步器,用于应用扩展
ThreadLocal<String> currentTransactionName-事务的名称
ThreadLocal<Boolean> currentTransactionReadOnly-事务是否是只读
ThreadLocal<Integer> currentTransactionIsolationLevel-事务的隔离界别
ThreadLocal<Boolean> actualTransactionActive-事务是否开启
TransactionSynchronizationManager状态变化的点
1. 开启新的事务时初始化TransactionSynchronizationManager属性,即第一次开启事务;已存在事务,但根据事务的传播属性需要开启新事务,这两个点。
public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
doBegin(transaction, definition);
prepareSynchronization(status, definition);
}
private TransactionStatus handleExistingTransaction(
TransactionDefinition definition, Object transaction, boolean debugEnabled)
throws TransactionException {
doBegin(transaction, definition);
prepareSynchronization(status, definition);
}
protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
if (status.isNewSynchronization()) {
TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
(definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) ?
definition.getIsolationLevel() : null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
TransactionSynchronizationManager.initSynchronization();
}
}
2. 在事务的嵌套过程中,
TransactionSynchronizationManager属性不断更新最终清除,即外层事务挂起;事务提交,这两个点需要更新TransactionSynchronizationManager属性
protected final SuspendedResourcesHolder suspend(Object transaction) throws TransactionException {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.setCurrentTransactionName(null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(false);
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(null);
TransactionSynchronizationManager.setActualTransactionActive(false);
}
}
private void cleanupAfterCompletion(DefaultTransactionStatus status) {
TransactionSynchronizationManager.clear();
}
SuspendedResourcesHolder-外层事务挂起时,保存事物属性的对象,用于恢复外城事务和TransactionSynchronizationManager
protected final SuspendedResourcesHolder suspend(Object transaction) throws TransactionException {
return new SuspendedResourcesHolder(
suspendedResources, suspendedSynchronizations, name, readOnly, isolationLevel, wasActive);
}
protected static class SuspendedResourcesHolder {
//底层事务框架在挂起处存储的对象,用于扩展
private final Object suspendedResources;
//同步器
private List<TransactionSynchronization> suspendedSynchronizations;
private String name;
private boolean readOnly;
private Integer isolationLevel;
private boolean wasActive;
}
当回复外层事务时,根据SuspendedResourcesHolder对象,调用底层事务框架回复事务属性,并恢复TransactionSynchronizationManager
protected final void resume(Object transaction, SuspendedResourcesHolder resourcesHolder)
throws TransactionException {
if (resourcesHolder != null) {
Object suspendedResources = resourcesHolder.suspendedResources;
if (suspendedResources != null) {
doResume(transaction, suspendedResources);
}
List<TransactionSynchronization> suspendedSynchronizations = resourcesHolder.suspendedSynchronizations;
if (suspendedSynchronizations != null) {
TransactionSynchronizationManager.setActualTransactionActive(resourcesHolder.wasActive);
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(resourcesHolder.isolationLevel);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(resourcesHolder.readOnly);
TransactionSynchronizationManager.setCurrentTransactionName(resourcesHolder.name);
doResumeSynchronization(suspendedSynchronizations);
}
}
}
3. DefaultTransactionStatus-这个是整个事务框架最重要的状态对象,它贯穿于事务拦截器,spring抽象框架和底层具体事务实现框架之间,它的重要任务是在新建,挂起,提交事务的过程中保存对应事务的属性。在AbstractPlatformTransactionManager中,每个事物流程都会创建这个对象
//新建事务
protected DefaultTransactionStatus newTransactionStatus(
TransactionDefinition definition, Object transaction, boolean newTransaction,
boolean newSynchronization, boolean debug, Object suspendedResources) {
boolean actualNewSynchronization = newSynchronization &&
!TransactionSynchronizationManager.isSynchronizationActive();
return new DefaultTransactionStatus(
transaction, newTransaction, actualNewSynchronization,
definition.isReadOnly(), debug, suspendedResources);
}
//PROPAGATION_REQUIRED传播时,使用上层事务
protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
if (status.isNewSynchronization()) {
TransactionSynchronizationManager.setActualTransactionActive(status.hasTransaction());
TransactionSynchronizationManager.setCurrentTransactionIsolationLevel(
(definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) ?
definition.getIsolationLevel() : null);
TransactionSynchronizationManager.setCurrentTransactionReadOnly(definition.isReadOnly());
TransactionSynchronizationManager.setCurrentTransactionName(definition.getName());
TransactionSynchronizationManager.initSynchronization();
}
}
4. DataSourceTransactionObject-底层JDBC具体框架使用的对象,其中包含ConnectionHolder,这个对象被上层spring抽象事物层的DefaultTransactionStatus持有,用于这两层事务框架的交互
5. ConnectionHolder-底层JDBC以dtasource为key,存储事务相关属性对象,是底层判断事务是否存在的关键。
public class ConnectionHolder extends ResourceHolderSupport {
public static final String SAVEPOINT_NAME_PREFIX = "SAVEPOINT_";
private ConnectionHandle connectionHandle;
private Connection currentConnection;
private boolean transactionActive = false;
private Boolean savepointsSupported;
private int savepointCounter = 0;
}
分享到:
相关推荐
下面,我们将从以下几个方面对Spring框架进行深入剖析:Spring AOP(面向切面编程)、Spring Boot、Spring IoC容器以及Spring与MyBatis的集成。 ### Spring AOP(面向切面编程) 面向切面编程(Aspect Oriented ...
本合集深入剖析了Spring的诸多关键特性,包括依赖注入、配置类解析、Bean生命周期管理、以及与MyBatis的整合等,旨在帮助读者构建起对Spring全面而深入的认识。 1. **依赖注入源码解析**:在"06-Spring之依赖注入...
《Spring框架深度剖析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现原理一直是广大开发者关注的重点。本篇文章将深入探讨Spring的核心组件、工作原理以及关键功能的源码分析,帮助读者理解并...
### Spring学习复习资料知识点梳理 #### 一、Spring框架概览 - **Spring** 是一个分层的全栈...通过深入学习 Spring 的各个组成部分和高级特性,开发者可以更好地掌握企业级应用开发的核心技能,提高自身的竞争力。
- **Spring事务管理**:通过声明式事务管理和编程式事务管理两种方式实现。 综上所述,Spring框架提供了丰富的特性和工具,旨在简化企业级Java应用程序的开发。通过深入了解这些核心概念和技术细节,开发者可以更好...
在本文中,我们将深入探讨Spring事务管理的一些高级应用难点,特别是涉及多线程场景下的事务处理。 首先,Spring事务管理器利用了ThreadLocal来在每个线程中保存数据访问基础设施,如数据库连接。ThreadLocal是一种...
《深入剖析Hibernate与Spring源码》 在Java开发领域,Hibernate和Spring是两个不可或缺的开源框架,它们极大地简化了企业级应用的开发工作。本文将深入探讨这两个框架的内部机制,帮助开发者理解其核心原理,从而更...
《深入剖析Spring源码》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,它以其灵活、高效和强大的功能深受开发者喜爱。本文将深入探讨Spring框架的源码,帮助读者理解其内部机制,提升对Spring的...
《Spring in Action》是一本深度剖析Spring框架的权威著作,中文版的出现使得国内开发者能够更方便地学习和理解Spring的核心概念与实践技巧。书中的内容涵盖了从基础到高级的各个方面,是Java开发者提升Spring技能的...
本"Spring源码视频教程"旨在深入剖析Spring框架的工作原理,帮助开发者从源码层面理解其设计思想与实现方式。 在Spring框架中,核心概念包括: 1. **IoC容器**:它是Spring的核心,负责管理对象的生命周期和对象...
《深入剖析基于Java的Spring4GWT集成框架》 在当今的软件开发领域,Java以其强大的功能和广泛的社区支持,成为企业级应用开发的首选语言。Spring框架作为Java EE领域的重要组成部分,为开发者提供了丰富的功能,...
这份名为“Spring核心知识点完整梳理(史上最全,值得收藏)”的资料可能是对Spring框架进行全面剖析的文档,涵盖了Spring的各种关键概念和技术。 1. **依赖注入(Dependency Injection,DI)**:这是Spring的核心...
《Spring in Action》是一本深度剖析Spring框架的权威著作,其中文版的第19到27部分涵盖了Spring框架的诸多关键概念和技术。这些章节详细介绍了如何利用Spring进行企业级应用开发,包括但不限于依赖注入、AOP(面向...
Spring Cloud为开发者提供了构建分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)的工具集合,是构建大型微服务架构的重要支撑。...
本文将深入剖析一个基于SpringMVC、MyBatis、Spring、Maven以及MySQL构建的网上租车系统的实现原理和技术栈,旨在帮助读者理解如何运用这些技术来构建类似的Web应用。 首先,让我们了解这个系统的架构基础。...
本资料主要针对Hibernate面试中的常见问题进行深入剖析,帮助读者全面理解并熟练运用Hibernate。 1. Hibernate概述 Hibernate是由 Gavin King 创建的一个开源项目,它简化了Java应用与数据库之间的交互,通过提供...
《深入体验Java Web开发内幕-高级特性》这本书深入剖析了Java Web开发的高级技术,旨在帮助开发者提升在这一领域的专业技能。以下将详细介绍其中的一些关键知识点: 1. **Servlet与JSP**:Servlet是Java Web应用的...