TransactionTemplate、事务管理器和DataSource数据源三者的关系
- 1. TransactionTemplate - “事务执行模板”
- 2. PlatformTransactionManager - “事务执行引擎”
- 3. DataSource - “连接工厂”
- 事务拦截器、事务管理器和DataSource数据源三者的关系
- DriverManager、DataSource、数据库驱动以及数据库连接池的关系
TransactionTemplate、事务管理器(PlatformTransactionManager)和数据源(DataSource)三者的关系,可以用一个更直接的比喻来理解:它们构成了一个从“业务指令”到“数据库操作”的清晰流水线。
下图直观地展示了当你使用TransactionTemplate执行一段业务代码时,这三个核心组件是如何协同工作的,特别是它们与关键的线程绑定(ThreadLocal)机制的交互:
// mermaidsequenceDiagram participant TT asTransactionTemplateparticipant TM as 事务管理器<br/>(PlatformTransactionManager)participant DDS as 动态数据源<br/>(DynamicDataSource)participantBizas 你的业务逻辑<br/>(在Callback中)Noteover TT,DDS:阶段一:准备与开启事务 TT->>TM:1.getTransaction()Noteright of TM:根据传播行为等属性<br/>决定开启新事务或加入现有事务 TM->>DDS:2.getConnection()Noteright of DDS:关键路由点:调用determineCurrentLookupKey()<br/>依赖你预先在ThreadLocal中设置好的数据源KeyDDS-->>TM:3.返回对应的物理连接Noteright of TM:4.将连接绑定到当前线程<br/>(TransactionSynchronizationManager)TM-->>TT:5.返回TransactionStatus(事务状态凭证)Noteover TT,DDS:阶段二:在事务中执行业务 TT->>Biz:6.execute(transactionStatus->>{...})Noteright ofBiz:7.你的业务代码执行SQL<br/>(框架会从当前线程获取已绑定的连接)Noteover TT,DDS:阶段三:结束与清理Biz-->>TT:8.返回业务结果 TT->>TM:9.commit(transactionStatus)<br/>或rollback(...)Noteright of TM:10.提交/回滚,并执行关键操作:<br/>-解除连接的线程绑定<br/>-关闭/归还连接 TM-->>TT:完成 TT-->>调用方:返回最终结果1. TransactionTemplate - “事务执行模板”
- 它是什么:Spring提供的编程式事务管理核心工具类。它将事务管理的样板代码(如开始、提交、回滚、异常处理)封装起来。
- 核心方法:
execute(TransactionCallback<T> action)。我们只需要把要在事务中执行的业务逻辑,以回调函数(lambda)的形式写进去。 - 它与事务管理器的关系:
TransactionTemplate内部必须持有一个PlatformTransactionManager的引用。它自己不管理事务,所有事务操作(getTransaction,commit,rollback)都委托给这个管理器去执行。
2. PlatformTransactionManager - “事务执行引擎”
- 角色不变:和声明式事务中一样,它是实际操作事务的组件。
DataSourceTransactionManager是其最常见实现。 - 关键动作:当
TransactionTemplate调用其getTransaction()方法时,它执行我们图中描述的关键步骤2-4:获取连接、绑定线程。
3. DataSource - “连接工厂”
- 角色不变:负责生产
Connection对象。在你的项目中,它就是动态数据源(AbstractRoutingDataSource)。 - 核心时机:它的路由逻辑(
determineCurrentLookupKey())正是在步骤2,被事务管理器调用时触发的。