返回 Bug 清单
BUG-0364project-29高已修复backend-logic

手写 BEGIN/COMMIT 拼 SQL 事务 —— 连接池下根本不在同一连接,merge 接口 500

发现:2026-10-01验证:2026-10-09置信度:95%

症状

账户合并接口偶发 500 且数据可能只改了一半——『事务』从未真正生效。

根因

连接池模式下,裸 BEGIN 与后续语句可能落在不同连接上:BEGIN 开在连接 A,UPDATE 走了连接 B,COMMIT 提交的是连接 A 的空事务。事务原子性必须由『同一连接上的事务 API』保证,SQL 字符串拼不出来。

修复方案

1) 一律改用 ORM/驱动的事务 API(db.transaction(async tx => ...)),闭包内所有语句显式用 tx 句柄; 2) code review 规则:业务代码出现裸 BEGIN/COMMIT/ROLLBACK 字符串即打回; 3) 带写路径的接口加集成测试:中途抛错后断言『什么都没发生』。

检测命令

grep -rn 'BEGIN\|COMMIT' --include='*.ts' --include='*.js' <db 层> | grep -v transaction(

错误签名

merge 接口 500;代码里对 db 对象手写 BEGIN/COMMIT 语句包裹多条操作

技术信息

来源项目

project-29

标签

transaction, connection-pool, atomicity, data-integrity