惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
J
Java Code Geeks
雷峰网
雷峰网
WordPress大学
WordPress大学
L
LangChain Blog
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
P
Proofpoint News Feed
腾讯CDC
GbyAI
GbyAI
罗磊的独立博客
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
F
Fortinet All Blogs
Y
Y Combinator Blog
V
V2EX
A
About on SuperTechFans

Aimee's Blog

秒杀怎么防机器人:验证码之外的几道防线 防薅羊毛怎么做:号码风控、设备指纹与分层策略 接口限流怎么选:固定窗口、滑动窗口、令牌桶 批量打包下载怎么设计:流式 ZIP 与异步任务 图片处理怎么做:异步处理与 CDN 实时参数 大文件上传怎么设计:分片、断点续传、秒传 报表可重跑的设计:快照、水位线与幂等 UV 统计为什么有误差:精确计数与近似计数怎么选 大数据量导出怎么做:流式写入与异步任务 排行榜的两类需求,难度差了一个数量级 内容审核怎么选:先审后发,还是先发后审 实时热榜怎么设计:Redis ZSet 与热度分值 互关状态怎么保持同步:双向关系的维护与缓存失效 并发点赞的计数设计:原子操作与最终对账 删了父评论,子评论怎么处理——先想清楚用户看到的是什么 定时消息任务触发了两次 消息量大,写扩散还是读扩散——接到这个需求先问清楚规模 同一条消息推送了三次 活动结束了,用户还在收短信 微服务与服务拆分:何时拆、怎么拆 异步与事件驱动架构:把协作从「打电话」改成「发消息」 高可用设计:怎么让系统尽量不宕机 可扩展性设计:怎么让系统加机器就能扛更多 缓存架构:多级缓存怎么搭 高并发三板斧:限流、熔断、降级 架构设计到底在设计什么 —— 从单体到微服务的演进 服务成本账:一个服务一个月烧多少钱 可观测性:线上出问题怎么查 API 设计:好接口长什么样 消息队列:为什么要 MQ,以及丢失、重复、顺序怎么破
接到注销需求,先问两个问题
Aimee · 2026-07-31 · via Aimee's Blog

接到注销需求,先问两个问题

用户注销账号——这个功能听起来不复杂,无非就是删掉数据。

但在动手之前,两个问题必须先问清楚:数据删到什么程度? 注销后用同一手机号重新注册,老数据要不要继承?

这两个问题的答案,决定了整个方案的走向。


软删除,而不是物理删除

直接 DELETE FROM user WHERE id = ? 是最危险的做法。

原因一:历史订单、交易记录、日志需要保留(法律合规、对账、客诉追溯)。 原因二:物理删除后,这个账号 ID 可能被新账号复用,历史数据的 user_id 就指向了错误的人。 原因三:误操作无法恢复。

标准做法是软删除:在 user 表加 deleted_atdeleted 字段,注销时打标而不是删行:

UPDATE user
SET deleted = 1,
    deleted_at = NOW(),
    phone = CONCAT('deleted_', id, '_', phone),   -- 手机号脱敏,腾出号码供重新注册
    nickname = '已注销用户'
WHERE id = ?

手机号脱敏这一步很关键:如果不腾出来,这个号码永远被占着,用户换手机号后无法重新注册;腾出来了,但要保留"这个号曾经注册过"的痕迹,以便后续处理。


注销后重新注册:老数据怎么处理

这是最容易踩坑的地方。

用户注销了账号 A(手机号 138xxxx),过了半年用同一个手机号重新注册,系统创建了账号 B。

账号 B 应该看到账号 A 的历史数据吗?

通常答案是:不应该。注销意味着数据清算,新号就是新用户。如果把账号 A 的历史数据自动继承给账号 B,会带来:

  • 账号 A 的敏感信息(收货地址、消费记录)泄露给了同号码的新用户
  • 账号 A 的黑名单、违规记录也被继承,新用户莫名其妙

所以软删除时,user_id 不复用,账号 B 是全新的 ID,看不到账号 A 的任何数据。


注销流程的必要步骤

注销不只是打一个删除标记,要触发一系列清理:

步骤内容时机
解绑第三方解除微信/支付宝/Apple 绑定注销时同步
取消订阅退出所有会员/自动续费注销时同步
冻结余额账户余额/积分处理(退款或作废)注销时触发
数据脱敏手机号、姓名、身份证等打码可异步,7 天内完成
清除登录态所有设备 Token 失效注销时同步
保留合规数据交易记录、日志按法规期限保留永久(或按规定期限)

有些步骤失败了怎么办(比如解绑第三方接口超时)?注销流程要设计成可补偿的,记录每个步骤的状态,失败的异步重试,不要因为一个步骤失败让整个注销流程回滚——用户在注销页面等着,超时会很崩溃。


冷静期和二次确认

注销是不可逆操作,主流平台都设 7-15 天冷静期:

  • 提交注销申请 → 状态变为"注销申请中"
  • 冷静期内用户可以撤销
  • 冷静期结束 → 正式执行注销流程

冷静期的副作用:这段时间手机号还不能被释放,用户如果换号要等冷静期过完。提前在 UI 上说清楚,减少客诉。