PostgreSQL 手册对此异常直接: 当一个应用程序收到此错误消息时, 它应该中止当前交易, 并从开始重试整个交易 。 "整笔交易"在该句中做了大量的工作,这是被撤销的部分.
TypeORM 第9806期——"交易出错(如死锁)的自动重试选项"自2023年2月起开放. 30 ,6个评论,未执行.
每周下载18.8万次, 因此生态系统对"我如何在节点使用"的实际回答是:不要.
使用,不要考虑写skew,和希望。
我花了一阵子 造出了问题要求的东西 我发现的简短版本:字面要求的特性无法正确构建,其原因比特性更有趣.
每个人到达后,都会先打包询问。
这是明显的动作——错误来自一个查询,所以重试查询: 这没什么用 比什么都糟糕——它把一个明显的错误变成了一个令人困惑的错误。
当 PostgreSQL 升起时, 它不会失败该语句 。
它会中止整个交易.
连接现在处于一个失败的交易状态,它上的每一个后续声明——包括你刚刚发布的再试——都回过来说: 所以在保证三次失败的声明中烧掉它的三次尝试,然后扔出而不是.
你用一个毫无意义的错误代替了可操作的错误, 并增加了150ms的睡眠来做它。
僵局也是如此。
受害人的交易已经死了,不是最后的陈述 到您有反应错误时, 已没有要重发的查询 。
更糟糕的是,你不知道它会在哪里被发射 我写了一份测试书 断言在...
故障会浮出水面...
连续的Snapshot相隔轨道读取/写入依赖性,并寻找一个危险的结构;我假设检查是在承诺时间发生的.
测试通过PostgreSQL
- 16号公路经过 17号公路经过 15号失败了 PostgreSQL的机器一注意到危险结构,就立即提升.
有时候,这是在,在你交易的每一个声明 已经成功返回。
有时是在相互矛盾的陈述本身.
这取决于版本,计划,以及交接.
这不是你能预测的东西, 也不是你应该写代码。
替换它的测试 坚持唯一真正稳定的东西: 这是一般的教训, 即使你从不碰它,我也会保留它: 关于数据库行为的断言, 通过推理得出的是假设。
对照你实际支持的版本运行它们.
我有一个干净的心理模型 SIS,这是错误的方式 只有版本矩阵可以告诉我。
将重试到交易边界 如果无法重试该语句,则重试拥有交易的事物.
无论什么叫的都要滚回,打开新的连接和交易,从上方重新运行整个回调.
这是一个小的变化 在哪里循环, 一个巨大的变化 API的意思, 因为现在你的回调运行不止一次。
取消两个数据库的写入。
它不会解开电子邮件, 解开卡片, 或者解开信件 。
定律是将所有非交易推迟到交易持久后进行: 拇指规则:如果取消交易需要超过...,它属于承诺钩.
我怀疑这一制约因素是第9806号新闻为何三年半开放的主要原因。
增加一个选项是下午。
添加一个不默不作声地重复充电的人的选项,需要一个承诺-hook机制,一个每一次尝试重置的登记簿,对危险进行记录,以及决定如何处理在尝试中发生突变的记忆状态.
这是一种将设计拖入背后的特征.
慢跑不是个好人