返回 Bug 清单
BUG-0340project-47中已修复data-consistency
软删除与状态不变量脏数据 —— BOUND 卡 balance=0、deleted_at=NULL 的孤儿用户
发现:2026-10-01验证:2026-10-09置信度:90%
症状
恢复/清理等下游逻辑依赖 deleted_at 或状态-余额组合做判断,脏数据导致空指针或错误放行。
根因
写入路径没有把『状态与伴随字段必须同时落』当作不变量维护;异常中断或历史代码留下了半完成的写入。
修复方案
1) 一次性数据修复:孤儿用户的 deleted_at 取自其最早 CANCELLED 订单时间(保证超过恢复窗口、语义自洽),BOUND 余额为 0 的卡按业务规则收尾为 CONSUMED;
2) 把不变量写进写入路径:is_deleted=1 必须同事务写 deleted_at;
3) 巡检 SQL 定期断言不变量,出现即告警。
检测命令
SELECT COUNT(*) FROM users WHERE is_deleted=1 AND deleted_at IS NULL; # 及同类不变量断言错误签名
status='BOUND' 且 balance=0 的卡;is_deleted=1 但 deleted_at=NULL 的用户技术信息
来源项目
project-47
标签
soft-delete, data-invariant, dirty-data, orphan-records