POST /posts/42/toggle-like 这种「切换」语义在重试下必然出错:第一次写库成功但响应丢了,浏览器重试就把赞取消,两次事务都提交成功、数据完整性完美、用户意图正好相反。事务和行锁都救不了,因为它们只管一次操作内部的原子性。解法是改语义:请求改成「确保我的赞存在」,第一次创建,重试发现已存在就保持不动,响应可以不同但意图效果一致。
🔑 核心要点
写库和发送响应是两个步骤,连接可能在提交之后断掉,客户端无从判断写是否成功。
事务保证原子性,但对第二次请求无效——那是一次新的、完全合法的事务。
幂等的关键是描述期望状态而非动作:用「确保存在」代替 toggle。
💡 金句
“Instead of asking the API to toggle, ask it to make sure my like exists.” 译:不要请求 API 去「切换」,而是请求它「确保我的赞存在」。