`
blue2048
  • 浏览: 183067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring事务深入剖析 - 一些重要状态对象的分析

阅读更多

在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源码解读-地址.txt

    下面,我们将从以下几个方面对Spring框架进行深入剖析:Spring AOP(面向切面编程)、Spring Boot、Spring IoC容器以及Spring与MyBatis的集成。 ### Spring AOP(面向切面编程) 面向切面编程(Aspect Oriented ...

    spring源码合集spring源码合集

    本合集深入剖析了Spring的诸多关键特性,包括依赖注入、配置类解析、Bean生命周期管理、以及与MyBatis的整合等,旨在帮助读者构建起对Spring全面而深入的认识。 1. **依赖注入源码解析**:在"06-Spring之依赖注入...

    spring-analysis-源码.rar

    《Spring框架深度剖析》 Spring框架作为Java领域最流行的开源框架之一,它的设计思想和实现原理一直是广大开发者关注的重点。本篇文章将深入探讨Spring的核心组件、工作原理以及关键功能的源码分析,帮助读者理解并...

    spring学习复习资料

    ### Spring学习复习资料知识点梳理 #### 一、Spring框架概览 - **Spring** 是一个分层的全栈...通过深入学习 Spring 的各个组成部分和高级特性,开发者可以更好地掌握企业级应用开发的核心技能,提高自身的竞争力。

    Spring6_pdf版讲义.pdf

    - **Spring事务管理**:通过声明式事务管理和编程式事务管理两种方式实现。 综上所述,Spring框架提供了丰富的特性和工具,旨在简化企业级Java应用程序的开发。通过深入了解这些核心概念和技术细节,开发者可以更好...

    Spring事务管理高级应用难点剖析(4)

    在本文中,我们将深入探讨Spring事务管理的一些高级应用难点,特别是涉及多线程场景下的事务处理。 首先,Spring事务管理器利用了ThreadLocal来在每个线程中保存数据访问基础设施,如数据库连接。ThreadLocal是一种...

    hibernate和Spring源码

    《深入剖析Hibernate与Spring源码》 在Java开发领域,Hibernate和Spring是两个不可或缺的开源框架,它们极大地简化了企业级应用的开发工作。本文将深入探讨这两个框架的内部机制,帮助开发者理解其核心原理,从而更...

    spring:spring源码阅读-spring源码阅读

    《深入剖析Spring源码》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,它以其灵活、高效和强大的功能深受开发者喜爱。本文将深入探讨Spring框架的源码,帮助读者理解其内部机制,提升对Spring的...

    完整的spring in action 中文版 10到18

    《Spring in Action》是一本深度剖析Spring框架的权威著作,中文版的出现使得国内开发者能够更方便地学习和理解Spring的核心概念与实践技巧。书中的内容涵盖了从基础到高级的各个方面,是Java开发者提升Spring技能的...

    spring源码视频教程

    本"Spring源码视频教程"旨在深入剖析Spring框架的工作原理,帮助开发者从源码层面理解其设计思想与实现方式。 在Spring框架中,核心概念包括: 1. **IoC容器**:它是Spring的核心,负责管理对象的生命周期和对象...

    基于java的Spring4GWT.zip

    《深入剖析基于Java的Spring4GWT集成框架》 在当今的软件开发领域,Java以其强大的功能和广泛的社区支持,成为企业级应用开发的首选语言。Spring框架作为Java EE领域的重要组成部分,为开发者提供了丰富的功能,...

    Spring核心知识点完整梳理(史上最全,值得收藏)

    这份名为“Spring核心知识点完整梳理(史上最全,值得收藏)”的资料可能是对Spring框架进行全面剖析的文档,涵盖了Spring的各种关键概念和技术。 1. **依赖注入(Dependency Injection,DI)**:这是Spring的核心...

    完整的spring in action 中文版 第19到27部分

    《Spring in Action》是一本深度剖析Spring框架的权威著作,其中文版的第19到27部分涵盖了Spring框架的诸多关键概念和技术。这些章节详细介绍了如何利用Spring进行企业级应用开发,包括但不限于依赖注入、AOP(面向...

    Spring in action

    Spring Cloud为开发者提供了构建分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)的工具集合,是构建大型微服务架构的重要支撑。...

    基于springmvc+mybatis+spring+maven+mysql的网上租车系统

    本文将深入剖析一个基于SpringMVC、MyBatis、Spring、Maven以及MySQL构建的网上租车系统的实现原理和技术栈,旨在帮助读者理解如何运用这些技术来构建类似的Web应用。 首先,让我们了解这个系统的架构基础。...

    Hibernate面试题分析.zip

    本资料主要针对Hibernate面试中的常见问题进行深入剖析,帮助读者全面理解并熟练运用Hibernate。 1. Hibernate概述 Hibernate是由 Gavin King 创建的一个开源项目,它简化了Java应用与数据库之间的交互,通过提供...

    深入体验Java Web开发内幕-高级特性.pdf

    《深入体验Java Web开发内幕-高级特性》这本书深入剖析了Java Web开发的高级技术,旨在帮助开发者提升在这一领域的专业技能。以下将详细介绍其中的一些关键知识点: 1. **Servlet与JSP**:Servlet是Java Web应用的...

Global site tag (gtag.js) - Google Analytics