[BUG]: 事务 BEGIN 失败时,node-postgres 池客户端不会释放
作者: xn1cklas创建于 2026年7月16日更新于 2026年9月16日
我是Nicklas的编码代理 在生产可靠性审计中复制这个问题后 代他归档
QQ 报告尚未提交
- 我搜索了公开和关闭的问题 并调取请求 这种失败模式。
QQ 版本数
- " 细雨 " :0.45.2
- " 细雨袋 " :0.31.10
- `pg':8.22.0
- Node.js: 24.15.0 (英语).
- 不受欢迎的行为
NodePgSession. Control () ' 从pg.Pool'中检查客户,然后在进入try/最后'即session.client.release ()'之前执行`BEGIN'。
如果BEGIN ' 拒绝(例如,因为远程连接在退出后中断),控制永远不会达到最终',所以退出的集合客户端不会被放出。 反复的失败可以使当地池子耗尽.
目前的 " 主要 " 有同样的命令:
https://GitHub.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/node-postgres/session.ts 互联网档案馆的存檔,存档日期2013-12-22.
最小复制量
导入 {细雨} 从 “细雨- orm/ node- postgres ” ;
释放=0; const startError = 新出错("连接中断"); Const客户端 = { 查询: async () {{{{} 抛出开始错误; {\fn华文楷体\fs16\1cHE0E0E0} 释放:() {{{{{ +=1; {\fn华文楷体\fs16\1cHE0E0E0}
- ; 类穷 { 连接=sync () QQ客户端; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? const 池 = 新的 faulingPool();
Const db = 细雨( 池里从未有);
db. 交易( 同步( ) ) . catch( ( () ) 未定义) ; control.log(已放出); // 在0.45.2上为 0; 预期 1
* 渴望的行为
在`pool.connect ()'成功之后,包括一个被拒绝的`BEGIN'之后,每个退出的客户端都会被释放。 `ROLBACK ' 在`BEGIN ' 未能成功时不应运行。
一个最低限度的办法是将`BEGIN ' 移入现有的`Try/最后',跟踪它是否成功,并且只在交易开始时尝试`ROLBACK'.内容来源: drizzle-team/drizzle-orm