把RPC包进事务的暗坑

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 # 方式:把判断放进 SQL,一条语句的原子性 rows = db.execute(""" UPDATE pay_record SET status = 'PAID' WHERE order_no = ? AND status = 'INIT' """, order_no) if rows == 0: return "已处理" # 别人改过了,我不是第一个 grant_coupon(order_no) # 只有改成功的那个才发券 return "success" grant_coupon失败会发生什么? 券永久丢失,该发没发,资损。 第一次请求: UPDATE status: INIT → PAID ✅ 已提交,改不回去了 grant_coupon(order_no) ❌ 抛异常 / 超时 / 下游挂了 第二次请求: rows = db.execute("UPDATE ... WHERE status = 'INIT'") # status已是PAID # rows == 0 return "已处理" # ← 被自己的幂等逻辑拦住,不会执行grant_coupon 包进一个事务能解决吗 把update和grant_coupon这两个操作,包进一个事务里,要么同时执行,要么同时回滚,是不是就解决了? ...

幂等测试

连续调用两次,第一次提交成功,第二次会被驳回——串行重复,系统是防住了的。

接口设计的可测试性

错误码不分层的接口,你只能靠 msg 断言,改个文案用例就跑失败。返回快照的字段返回了实时,数据就无法核对上。

一个请求的一生

点进Service,全是接口。点进ServiceImpl,前半段在校验业务规则,后半段调了个stockService.deduct(),又得跳到另一个Service。