在分布式系统中,当多个服务实例同时访问共享资源(如数据库中的库存)时,如何保证操作的互斥性?MySQL提供了两种核心机制来实现分布式锁:唯一约束(Unique Constraint) 和 行级锁(Row-Level Locking)。本文将通过一个真实的电商库存扣减场景,深入剖析这两种机制的本质区别与实现方式。
一、问题背景:100个用户抢购1件商品
假设我们有一个商品,ID为 1001
,库存 stock = 1
。在促销活动中,100个用户几乎同时下单购买该商品。如果没有任何并发控制,会发生超卖(库存变成 -99)。
我们的目标是:确保只有一个用户能成功下单,其余99个用户收到“库存不足”的提示。
二、方案一:基于唯一约束的分布式锁(推荐)
核心思想
利用数据库表的主键或唯一索引的唯一性特性。尝试插入一条记录,如果插入成功,说明“拿到锁”;如果因主键冲突失败,说明“锁已被占用”。
1. 创建锁表
-- 分布式锁表
CREATE