datasourcetransactionmanager是spring中专为单数据源jdbc设计的事务管理器,通过threadlocal绑定connection、封装jdbc的commit/rollback操作,支持传播行为、隔离级别、超时和只读等事务属性,并依赖innodb等支持事务的存储引擎及spring aop代理生效。

DataSourceTransactionManager 是 Spring 中最常用的事务管理器,专为单数据源 JDBC 场景设计。它不直接操作数据库,而是通过管理 Connection 的生命周期,把底层 JDBC 的事务能力(connection.commit() / connection.rollback())封装成 Spring 统一的事务语义。
核心工作流程:从 getTransaction 到 commit/rollback
整个过程围绕一个线程绑定、连接复用、状态跟踪的闭环展开:
-
获取事务时(getTransaction):检查当前线程是否已有绑定的 Connection;没有就从 DataSource 拿一个新的,并设为手动提交(
setAutoCommit(false)),再将该 Connection 和事务定义(如传播行为、隔离级别)一起封装为TransactionStatus返回 - 执行业务时:所有 DAO 操作(如 JdbcTemplate、MyBatis)会自动复用这个已绑定的 Connection,保证在同一个物理连接上执行 SQL,从而处于同一事务上下文
-
提交或回滚时(commit/rollback):调用 Connection 对应的
commit()或rollback()方法;完成后释放 Connection(归还给连接池),并清理线程绑定的资源
关键依赖:ThreadLocal + Connection 绑定
它靠 TransactionSynchronizationManager 内部的 ThreadLocal<map></map> 实现事务上下文的线程级隔离:
- 每个线程最多持有一个活跃的 Connection 引用,避免多线程误用事务
- 当方法嵌套调用且传播行为为
REQUIRED(默认)时,内层方法直接复用外层已有的 Connection,不新建事务 - 如果内层使用
REQUIRES_NEW,则先挂起外层 Connection,新建 Connection 并绑定到当前线程,完成后恢复外层
事务属性如何生效
它支持的事务定义(TransactionDefinition)主要影响两个环节:
-
隔离级别(isolation):在获取 Connection 后、执行 SQL 前,调用
connection.setTransactionIsolation()设置(前提是驱动支持) -
只读(readOnly):设为 true 时,会调用
connection.setReadOnly(true),部分数据库(如 MySQL)可据此优化执行计划 - 超时(timeout):不是数据库层面的 wait_timeout,而是 Spring 在事务开始后启动一个定时检查,超时未结束则主动回滚
常见注意事项
实际使用中容易踩坑的地方:
- 必须搭配支持事务的数据库(如 MySQL 的 InnoDB 引擎),MyISAM 不支持事务,设了也无效
- 事务仅对“受 Spring 管理的 Bean 方法”生效;直接 new 对象调用、this 调用本类方法,AOP 代理无法拦截,事务不生效
- 异常必须抛出到事务切面能捕获的位置——被 try-catch 吞掉、或捕获后没重新 throw,会导致 commit 而非 rollback
- 如果使用 Druid/HikariCP 等连接池,需确认其配置允许设置事务相关属性(如
defaultAutoCommit=false)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











