我已经知道在序列化失败的情况下应该重试可序列化级别的事务。
我只是对引发 40001 错误的 2 个场景感到好奇:
- 运行 INSERT 命令时。
- 发出准备交易声明时。
在每种情况下,序列化问题的根本原因是什么?您对这些特殊情况有何经验?
我想通过查看并发事务来尝试减少这些问题。
TIA。
更新 1
从PostgreSQL wiki我了解到,在可序列化的事务中,第一个 COMMIT 获胜。PREPARE 似乎表现得像一个 COMMIT 所以我可以理解为什么它可能会失败。
但是,对于 INSERT 情况,如果没有执行 SELECT 的并发可序列化事务,我就错过了重点。从我目前看到的情况来看,只有多个并发 INSERT。
更新 2
我发现我在同一张桌子上有并发 SELECT ... FOR SHARE。
更新 3
这里似乎有一种模式,当交易失败时,交易的持续时间比平时长。这是因为我们正在处理文件,这可能需要比预期更长的时间。我将尝试通过重新处理各种任务来减少事务的持续时间。