在出现"无法取消分配缓存语句"错误后的挂起事务
作者: Valodim创建于 2024年8月1日更新于 2026年5月26日
标签bug
首先,感谢您在该库上做的所有工作:+1: 描述错误
我们在一个典型的后端应用中使用 pgx,该应用通过 grpc 向客户端发送请求。我们通过 sqlx 使用 pgx 作为驱动程序。从版本 5.5.4 开始,我们开始注意到一些问题:
- 我们的生产日志中包含"无法释放缓存语句:连接已关闭"的行。大致而言,每天大约发生数百次,每天大约有数十万个请求,每个请求都是一个事务。
- 这种情况主要发生(但并非完全)在流式请求中。这些请求在用户取消时结束,因此我们假定这是一个与取消上下文行为相关的竞争条件。
- 记录的错误发生在调用
tx.Rollback()时,该函数是从一个defer调用的,该defer与事务相关并在取消的 RPC 方法结束时运行。 - 我们还开始看到一些挂起的事务处于"处于事务中闲置"状态,无限期(数小时),导致特别问题是它们持有锁。虽然这与记录条目没有直接关系,但它在同一时间开始发生,记录条目表明事务清理期间发生了错误。
内容来源: jackc/pgx