spring-r2dbc: 并发的第一次 `ConnectionFactoryUtils` 取得会泄露连接,并在反应性资源绑定期间发生失败

作者: Xiphoseer创建于 2026年9月14日更新于 2026年9月14日
标签in: datatype: bug

□ 总结

ConnectionFatoryUtils.getConnection(ConnectionFactory)'如果同时两次同时首次获得相同的、以前没有捆绑的ConnectionFactory',在同步功能允许的情况下共享主动反应交易上下文,则可能失败。 任何反应性交易管理者都可以确定这种上下文;它可能但不需要包 " 联系档案 " 。 如果确实如此,该工厂必须有别于声称的工厂(在拆开之后)。

两次收购都未发现持单人,每次同时产生一种联系,然后都试图为同一工厂装上一个单独的 " 接线人 " 。 后面的绑定失败 :

java.lang.Illegal State Exception: 已经对 [.] 键 [.] 绑定上下文

这是一次同步检查和行为竞赛,涉及春季框架的`春季-tx'交易资源约束。 要复制,不需要驱动程序,数据库,并行线程,或概率计时.

它主要是春季-r2dbc'问题:Connection FactoryUtils ' 拥有同步获取和具有约束力的协议。 Spring-tx'提供交易文本资源图和重复装订的无变体,但TransactionSynchronizationManager.bindResource'在拒绝第二持有者时,其行为符合设计。

□ LLM 披露

该报告和分析是在LLM的协助下编写的。 如上所述,所提供的测试是在当地汇编和执行的;行为和源路说法是从执行和 " 春季框架 " 7.0.2来源独立核实的。

我愿意准备一个回归测试 或执行Pull Request 一旦预定的语义 用于同时的第一次获取。

□ 版本( O)

  • 春季框架7.0.2(经核实的最新GA)
  • 反应堆核心/反应堆试验 3.8.1
  • 爪哇21号
  • 马文 3.9.7

同一复制商还通过了其对 " 春季框架 " 6.2.15的预期----错误的断言。 未进行分节版本 。

□ 最小样本

该样本可在https://GitHub.com/Xiphoseer/spring-r2dbc-connection-binding-race上查阅. (ConnectionBinding Race Test.java'和pom.xml')。 运行 :

贝壳 mvn 测试 - Dtest=连接Binding Race Test


6个嵌入式测试要通过:3个断言所观察到的错误,而控制则包括相继进入,预先约束,并同时在约束后再使用.

大多数设想方案使用 " R2dbcTransactionManager " 与一工厂并用,在第二工厂进行竞争。 这不是一种协调的双资源交易;第二所工厂只分享被动交易的背景和同步生命周期. 一个仅同步的`活性交易管理器'也会复制失败。

测试使用被嘲笑的连接和虚拟时间;明显的拖延使得输掉的对手具有决定性. 它直接锻炼出Spring的绑定代码. 驾驶员的行为不能回避这场比赛:两次通话都已经观察到了在两个驾驶员的"创建()"完成之前的无约束工厂;驾驶员的计时只能决定哪个约束输了.

{\fn华文仿宋\fs16\1cHD1D1D1}
. . . . . . .

内容来源: spring-projects/spring-framework