事务拦截器TransactionInterceptor、事务管理器和DataSource数据源三者的关系
- 1. 事务拦截器 (TransactionInterceptor) - “交通指挥中心”
- 2. 事务管理器 (PlatformTransactionManager) - “施工现场经理”
- 3. DataSource数据源 - “资源仓库管理员”
事务拦截器(TransactionInterceptor)、事务管理器(PlatformTransactionManager)和DataSource数据源三者的关系,是Spring声明式事务的铁三角,它们之间协同工作。我们使用【动态数据源】的场景展示数据库操作的核心流程,如下所示:
- 事物拦截器:事务拦截器TransactionInterceptor
- 动态数据源:Sharding分库分表复杂SQL之数据源路由
1. 事务拦截器 (TransactionInterceptor) - “交通指挥中心”
- 职责:它是AOP中的“通知”,负责拦截
@Transactional方法调用,是事务处理的总协调者。但它不直接管理事务或连接。 - 关键动作:
- 解析属性:确定方法需要的事务传播行为、隔离级别等。
- 调用管理器:将具体事务工作(获取连接、提交、回滚)委托给事务管理器(
PlatformTransactionManager)。 - 异常转换:将数据库或JDBC异常转换为Spring的统一事务异常。
2. 事务管理器 (PlatformTransactionManager) - “施工现场经理”
- 职责:它是事务操作的具体执行者,是Spring事务抽象的核心接口。你配置的
DataSourceTransactionManager是其最常见实现。 - 关键动作:
- 管理生命周期:具体执行
getTransaction(),commit(),rollback()。 - 连接绑定:在事务开启时,它会从DataSource获取连接,并通过
TransactionSynchronizationManager.bindResource()将连接绑定到当前线程。这是保证同一个事务中使用同一连接的关键。 - 同步管理:管理事务同步回调(如
afterCommit)。
- 管理生命周期:具体执行
3. DataSource数据源 - “资源仓库管理员”
- 职责:纯粹负责提供标准的
java.sql.Connection连接对象。 - 在你的项目中的关键:你配置的动态数据源(
AbstractRoutingDataSource)是其高级实现。- 它的核心方法是
determineCurrentLookupKey()。该方法被调用的时机,正是事务管理器在getTransaction()过程中向其获取连接时。 - 此时,它必须能从
TransactionSynchronizationManager或你自定义的DataSourceContextHolder(本质也是ThreadLocal)中正确获取到之前由切面设置的数据源标识,才能返回正确的物理连接。
- 它的核心方法是