关于@Transactional传播特性与JdbcTemplate连接复用的技术疑问
疑问解答
1. 先后两次调用API(第一次未完成时发起第二次),会生成单个事务还是两个独立事务?
- 会生成两个独立事务。
- 原因:Spring MVC中每个HTTP请求由独立线程处理,两次请求分属不同线程上下文。
Propagation.REQUIRED仅在当前线程内检查活跃事务,第一次请求的线程会创建专属事务,第二次请求的线程无活跃事务,也会创建新的独立事务,二者完全隔离。
2. @Transactional与JdbcTemplate搭配使用是否有效?连接池大小≥2时,JdbcTemplate如何获取同一个连接对象?
- 二者搭配完全有效,Spring事务管理对JdbcTemplate提供原生支持。
- Spring通过线程绑定机制实现连接复用:
@Transactional方法启动事务时,Spring从连接池获取连接并绑定到当前线程的ThreadLocal存储中;JdbcTemplate执行数据库操作时,会优先从当前线程上下文获取绑定的连接,而非直接从连接池取新连接,因此同一事务内的JdbcTemplate操作会复用同一个连接。
3. “每个线程对应一个事务”的官方资源在哪里?使用Hikari连接池时,Spring如何确保JdbcTemplate使用绑定的连接?
- Spring官方文档的核心事务章节明确了这一逻辑:Spring事务管理器通过
ThreadLocal维护当前线程的事务上下文,每个线程的事务上下文独立,对应独立的事务。 - 使用Hikari连接池时,Spring的
DataSourceTransactionManager会先从Hikari连接池获取连接,将其绑定到当前线程的ThreadLocal;JdbcTemplate执行execute()等方法时,通过DataSourceUtils工具类从线程上下文获取绑定的连接,而非直接调用Hikari的getConnection(),因此能确保使用事务启动时拿到的指定连接(如connectionId1554)。
内容的提问来源于stack exchange,提问作者Rajat Aggarwal
相关产品推荐
相关产品推荐

