WMX · 随记
·Java· 3 分钟阅读

UUID 与幂等键:唯一编号只是起点

客户端超时后重试创建订单,即便每次生成的 UUID 都不同,系统仍可能创建重复订单。唯一性并没有解决同一次业务操作的识别问题。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

客户端超时后重试创建订单,即便每次生成的 UUID 都不同,系统仍可能创建重复订单。唯一性并没有解决同一次业务操作的识别问题。

理解核心机制

幂等键应代表同一次逻辑请求,并在重试中保持稳定。服务端还要把键、请求摘要和结果以适当事务方式保存,避免“检查没有再创建”的竞态。UUID 可以充当标识载体,但不是完整协议。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java10 行 · 可横向滚动
import java.util.UUID;
public class Demo {
    public static void main(String[] args) {
        UUID requestKey = UUID.randomUUID();
        String firstAttempt = requestKey.toString();
        String retryAttempt = requestKey.toString();
        System.out.println(firstAttempt.equals(retryAttempt));
        System.out.println(UUID.fromString(firstAttempt).version());
    }
}

适用边界与常见误区

幂等键不能替代权限检查。还要定义同键不同参数、结果过期、处理中重试和故障恢复的行为,数据库唯一约束通常是重要的一层。

继续练习

画出两个并发请求使用相同键的时序图,标出必须原子完成的步骤;再考虑原请求成功但响应丢失的情况。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档