当前位置: 首页 > news >正文

Spring事务管理实现机制

Spring通过一系列精妙的抽象和实现来完成事务的融入、挂起和嵌套操作。下面我将详细解析Spring如何实现这些事务行为。

1. 核心组件

Spring事务管理的核心组件包括:

  • PlatformTransactionManager:事务管理器的抽象接口

  • TransactionDefinition:定义事务属性(传播行为、隔离级别等)

  • TransactionStatus:表示事务状态

  • TransactionSynchronizationManager:事务同步管理器(线程绑定资源管理)

2. 事务融入(REQUIRED)实现

当传播行为为PROPAGATION_REQUIRED时:

// 简化版AbstractPlatformTransactionManager处理逻辑
if (isExistingTransaction(transaction)) {// 已存在事务:融入现有事务return handleExistingTransaction(def, transaction, debugEnabled);
} else {// 不存在事务:创建新事务return startTransaction(def, transaction, debugEnabled, suspendedResources);
}

融入过程

  1. 通过TransactionSynchronizationManager判断当前线程是否已有事务

  2. 如果有,获取当前事务信息并加入

  3. 通过线程绑定机制(ThreadLocal)共享同一事务资源

3. 事务挂起(REQUIRES_NEW/NOT_SUPPORTED)实现

当传播行为需要挂起当前事务时:

// 挂起当前事务的典型实现
protected final SuspendedResourcesHolder suspend(@Nullable Object transaction) {// 1. 从当前线程解绑事务资源List<TransactionSynchronization> suspendedSynchronizations = TransactionSynchronizationManager.getSynchronizations();// 2. 解绑所有事务相关资源Map<Object, Object> suspendedResources = TransactionSynchronizationManager.unbindResource(obtainTransactionSynchronizationRegistry());// 3. 重置线程绑定状态TransactionSynchronizationManager.clear();return new SuspendedResourcesHolder(suspendedResources, suspendedSynchronizations);
}

挂起过程

  1. 保存当前事务状态到SuspendedResourcesHolder

  2. 从TransactionSynchronizationManager清理线程绑定

  3. 后续操作将在无事务或新事务中执行

4. 事务嵌套(NESTED)实现

对于PROPAGATION_NESTED的实现:

// DataSourceTransactionManager中的实现
if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {if (!useSavepointForNestedTransaction()) {throw new NestedTransactionNotSupportedException(...);}// 创建保存点Object savepoint = getSavepointManager().createSavepoint();return prepareTransactionStatus(definition, transaction, false, true, debugEnabled, savepoint);
}

嵌套实现关键点

  1. 检查数据库是否支持保存点

  2. 通过JDBC Savepoint机制实现

  3. 内部事务回滚只回滚到保存点

  4. 外部事务回滚会导致全部回滚

5. 底层实现技术

Spring实现这些行为的底层技术包括:

5.1 线程绑定机制

  • 使用TransactionSynchronizationManager维护线程绑定资源

  • 基于ThreadLocal存储当前事务状态

  • 关键方法:bindResource/unbindResource

5.2 JDBC抽象

  • 对Connection的包装(TransactionAwareDataSourceProxy)

  • 保存点管理(通过Connection#setSavepoint)

  • 事务隔离级别控制

5.3 事务同步

  • TransactionSynchronization接口

  • 注册回调处理(如afterCommit, afterCompletion)

  • 保证资源清理和状态恢复

6. 典型处理流程

// 简化版事务处理流程
public final TransactionStatus getTransaction(TransactionDefinition definition) {// 1. 获取或创建事务Object transaction = doGetTransaction();// 2. 检查当前线程是否已有事务if (isExistingTransaction(transaction)) {// 处理已存在事务的情况(融入/挂起/嵌套等)return handleExistingTransaction(definition, transaction, debugEnabled);}// 3. 处理无事务的情况return startTransaction(definition, transaction, debugEnabled, null);
}

7. 不同传播行为的实现对比

传播行为实现机制
REQUIRED加入现有事务或新建事务(线程绑定同一Connection)
REQUIRES_NEW挂起当前事务→新建事务→新Connection绑定到线程→原事务保存在SuspendedResourcesHolder
NESTED使用JDBC Savepoint机制(不创建新Connection)
NOT_SUPPORTED挂起当前事务→无事务执行→恢复原事务
MANDATORY强制检查当前是否存在事务

8. 事务恢复机制

当事务挂起后需要恢复时:

protected final void resume(@Nullable Object transaction, @Nullable SuspendedResourcesHolder resourcesHolder) {if (resourcesHolder != null) {// 恢复线程绑定的资源TransactionSynchronizationManager.bindResource(obtainTransactionSynchronizationRegistry(), resourcesHolder.getSuspendedResources());// 恢复同步器resourcesHolder.register();}
}

Spring通过这些精细的控制机制,实现了灵活的事务传播行为,为复杂业务场景提供了可靠的事务管理能力。

相关文章:

  • Halcon检测项目
  • 深入浅出之STL源码分析3_类模版实例化与特化
  • Shell 脚本编程1(常用命令+概述)
  • 金丝猴食品:智能中枢AI-COP构建全链路数智化运营体系
  • C++ 异常捕获 try 和 __try的区别笔记
  • Python环境搭建指南
  • 慈缘基金会“蝴蝶飞”助西藏女孩白玛卓嘎“折翼重生”
  • 基于STM32的居家环境监测报警Proteus仿真+程序设计+设计报告+讲解视频
  • smbd:快速拉取服務端SMB共享文件脚本工具
  • SAM详解3.2(关于2和3的题)
  • 黑马k8s(二)
  • 子串简写(JAVA)一维前缀和, 蓝桥杯
  • 学习黑客5 分钟深入浅出理解cron [特殊字符]
  • 基于阿伦尼斯模型的电池寿命预测:原理、应用与挑战
  • 【智能指针】
  • SD06_前后端分离项目部署流程(采用Nginx)
  • SAP Commerce(Hybris)开发实战(一)
  • linux-----------Ext系列⽂件系统(上)
  • 进阶 DFS 学习笔记
  • 链表头插法的优化补充、尾插法完结!
  • 富家罹盗与财富迷思:《西游记》与《蜃楼志》中的强盗案
  • 工程院院士葛世荣获聘任为江西理工大学校长
  • “降息潮”延续!存款利率全面迈向“1时代”
  • 全球第七个迪士尼主题公园将落户阿布扎比
  • 万里云端遇见上博--搭乘“上博号”主题飞机体验记
  • 湖北十堰市委副秘书长管聪履新丹江口市代市长