40001 不是一个查询错误

2026年8月25日2 次浏览来源:Dev.to阅读原文

PostgreSQL 手册对此异常直接: 当一个应用程序收到此错误消息时, 它应该中止当前交易, 并从开始重试整个交易 。 "整笔交易"在该句中做了大量的工作,这是被撤销的部分.

TypeORM 第9806期——"交易出错(如死锁)的自动重试选项"自2023年2月起开放. 30 ,6个评论,未执行.

每周下载18.8万次, 因此生态系统对"我如何在节点使用"的实际回答是:不要.

使用,不要考虑写skew,和希望。

我花了一阵子 造出了问题要求的东西 我发现的简短版本:字面要求的特性无法正确构建,其原因比特性更有趣.

每个人到达后,都会先打包询问。

这是明显的动作——错误来自一个查询,所以重试查询: 这没什么用 比什么都糟糕——它把一个明显的错误变成了一个令人困惑的错误。

当 PostgreSQL 升起时, 它不会失败该语句 。

它会中止整个交易.

连接现在处于一个失败的交易状态,它上的每一个后续声明——包括你刚刚发布的再试——都回过来说: 所以在保证三次失败的声明中烧掉它的三次尝试,然后扔出而不是.

你用一个毫无意义的错误代替了可操作的错误, 并增加了150ms的睡眠来做它。

僵局也是如此。

受害人的交易已经死了,不是最后的陈述 到您有反应错误时, 已没有要重发的查询 。

更糟糕的是,你不知道它会在哪里被发射 我写了一份测试书 断言在...

故障会浮出水面...

连续的Snapshot相隔轨道读取/写入依赖性,并寻找一个危险的结构;我假设检查是在承诺时间发生的.

测试通过PostgreSQL

  1. 16号公路经过 17号公路经过 15号失败了 PostgreSQL的机器一注意到危险结构,就立即提升.
    有时候,这是在,在你交易的每一个声明 已经成功返回。
    有时是在相互矛盾的陈述本身.
    这取决于版本,计划,以及交接.
    这不是你能预测的东西, 也不是你应该写代码。
    替换它的测试 坚持唯一真正稳定的东西: 这是一般的教训, 即使你从不碰它,我也会保留它: 关于数据库行为的断言, 通过推理得出的是假设。
    对照你实际支持的版本运行它们.
    我有一个干净的心理模型 SIS,这是错误的方式 只有版本矩阵可以告诉我。
    将重试到交易边界 如果无法重试该语句,则重试拥有交易的事物.
    无论什么叫的都要滚回,打开新的连接和交易,从上方重新运行整个回调.
    这是一个小的变化 在哪里循环, 一个巨大的变化 API的意思, 因为现在你的回调运行不止一次。
    取消两个数据库的写入。
    它不会解开电子邮件, 解开卡片, 或者解开信件 。
    定律是将所有非交易推迟到交易持久后进行: 拇指规则:如果取消交易需要超过...,它属于承诺钩.
    我怀疑这一制约因素是第9806号新闻为何三年半开放的主要原因。
    增加一个选项是下午。
    添加一个不默不作声地重复充电的人的选项,需要一个承诺-hook机制,一个每一次尝试重置的登记簿,对危险进行记录,以及决定如何处理在尝试中发生突变的记忆状态.
    这是一种将设计拖入背后的特征.
    慢跑不是个好人
分享