Back to blog

D1 上的原子写入:atomic() 实践

Nov 3, 2026VrmMate Team

多语句写入不能用 transaction,要用带 guard 的 atomic 批处理。

在 D1 上用 db().transaction() 保护多语句写入是危险的,因为它只是逐条执行。

正确做法

使用 core/db/atomic 的 atomic():在 D1、SQLite、Turso 上走 batch,在 Postgres、MySQL 上走真实事务。所有写语句先构建好,再一次性提交。

先读后写

读操作放在事务外,决定在 JS 里做完。写步骤里不要再查询,避免把判断建立在过期数据上。

guard 的用途

把前置条件写成 guard,例如订单状态必须为 created。并发重放时 guard 失败并抛出 AtomicGuardError,你按已处理分支返回即可。

常见坑

用相对更新配合 guard,比先读余额再写绝对值安全;D1 单条语句最多 100 个绑定参数,批量插入要分块。