返回 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