-
fix(migrate): 多语句迁移里不能写 CONCURRENTLY —— 解测试服部署卡死 · 8dba340f
现象:测试服 deploy 挂在 migrate 步,pac-service 起不来,任何人往测试服部署 都会挂在同一处(跟部署内容无关)。 ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block (25001) 根因是我在 20260728020000 里写了 14 条 CREATE INDEX CONCURRENTLY。 Prisma 把整份 migration.sql 用**一次 simple query** 发给 Postgres,而 Postgres 只对 「一个查询串里多条语句」隐式开事务块 —— 分界线是**语句条数,不是 Prisma 版本**: 20260701060607 / 20260727070000 / 20260727110000 各 1 条语句 → 无隐式事务 → 跑得通 20260728020000 14 条语句 → 隐式事务 → 必挂 而 20260727070000 里那句「Prisma 6.19 已不成立(指事务包裹)」是**错的归因** —— 单条语句侥幸跑通被总结成了「新版没有事务包裹」,我照抄进 20260728020000,于是踩爆。 失败后果比失败本身更重:_prisma_migrations 留下一条 finished_at / rolled_back_at 全空、 applied_steps_count=0 的记录,Prisma 从此拒绝执行**任何**后续迁移(P3018), 整条部署流水线被堵死。同一颗雷已随 6333137a 合进 main,生产下次部署会撞一模一样的错。 改动: - 20260728020000:14 条改为**普通** CREATE INDEX IF NOT EXISTS(可在事务里跑)。 大表环境靠「部署前手工 CONCURRENTLY 先建」保证不锁表(两台机器 2026-07-28 已建完, 故本迁移在两台上都是 IF NOT EXISTS 空跑);从零建库时表为空,普通 CREATE INDEX 瞬间完成。 文件头补上完整复盘,明写"别再改回 CONCURRENTLY"。 - 20260727070000 / 20260727110000:订正那两处错误归因,改成"因为本文件只有 1 条语句"。 验证: - 把修好的整份文件用 `psql -1 -v ON_ERROR_STOP=1`(显式单事务,正是 Prisma 那种场景) 在测试服跑通,14 条全 skip,无 25001。 - 测试服已 `prisma migrate resolve --rolled-back 20260728020000_...` 解除 P3018 阻塞, 14 条索引仍在(pg_indexes 计数 14),库结构未被破坏。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| migrations | Loading commit data... | |
| schema.prisma | Loading commit data... | |
| seed.ts | Loading commit data... |