dev.to | 📄 原文链接 | 2026-09-07 收录

你的审计日志很可能在骗你:Postgres 18 用一条语句修复它

来源:dev.to — 2026-09-06

📋 概述

作者指出经典的 read-then-write 记账模式(SELECT 余额→应用层算数→UPDATE 写回→INSERT 审计行)存在致命竞态:十个并发 worker 各扣 10 元,结果十人都读到 100、都写回 90,最终余额 90,而审计日志十行整齐一致地各自声称「自己做了那笔 100→90 的扣款」——日志与自己完全一致,没有任何校验器能发现异常,这正是审计日志被用来抓这类问题却反而把它埋掉的原因。Postgres 18 的新特性让 RETURNING 直接支持 old/new 别名,可在同一条语句里既完成原子扣减又读出真实被覆盖的旧值,一条语句同时修复了丢失更新与审计失实两个问题。

🔑 核心要点

💡 金句

一个读后写模式我写了多年,还加了审计表去抓这类模式制造的问题,却从没注意到审计表自己也继承了同一个竞态、因而根本看不见它——十行记录,完美自洽,却全部是错的。
← 返回 dev.to 首页