在电商秒杀场景中,高并发极易导致“超卖”问题(即实际卖出的商品数量超过了库存数量)。在使用MySQL作为底层存储时,防止超卖的核心在于保证扣减库存操作的原子性和排他性。 以下是利用MySQL锁机制防止超卖的三种核心方案,以及在秒杀场景下的优劣势分析: 方案一:排他锁(悲观锁)—— 悲观锁的思想是:在操作数据前,先假定大概率会发生冲突,因此直接把数据锁住,直到操作完成才释放。 实现方式: 依赖 MySQL InnoDB 引擎的行级锁。在开启事务后,查询库存时加上 。 底层原理: 会对主键 的记录加上排他锁(X锁)。其他并发的请求执行到这条 语句时,会被阻塞,直到当前事务提交释放锁。这就相当于把并发请求变成了串行执行。 优点: 逻辑简单,能绝对保证不超卖,数据强一致。 致命缺点(不适合秒杀): 秒杀场景下并发极高。悲观锁会导致大量请求在数据库层排队等待锁,引发极高的锁竞争。这不仅会导致接口响应极慢、大量请求超时,还极易耗尽数据库连接池,最终导致数据库宕机。 --- 方案二:基于版本号的乐观锁 乐观锁的思想是:假定冲突很少发生,不上锁,只在最后更新数据时,判断数据在此期间有没有被别人修...