《高并发超卖问题及解决方案》文章封面
技术笔记约 4 分钟

高并发超卖问题及解决方案

从并发扣减库存的竞态条件出发,对比悲观锁与乐观锁解决超卖问题的思路和取舍。

#Java#高并发#数据库
文章目录0%
  1. 01超卖问题
  2. 02什么是超卖问题
  3. 03悲观锁
  4. 04乐观锁

超卖问题

什么是超卖问题

此时有两个线程,线程1查询到库存还有一个,然后线程1开始扣减库存,由于是高并发场景,线程2在线程1没有开始扣减库存时也查到了还有一个库存,于是也开始扣减库存,造成了超卖问题。

解决方案:

悲观锁

  • 含义:简单来说,悲观锁认为数据冲突一定会发生,在一个线程修改数据前将其锁定,然后操作成功后释放锁,以确保数据的一致性和完成性
  • 实践:在Java中,常见的悲观锁实现是使用synchronized关键字或ReentrantLock类。
  • 优点:绝对安全,能够确保数据的完整性和一致性
  • 缺点:阻塞其他线程,效率低下,容易造成死锁。

乐观锁

  • 含义:简单来说,乐观锁认为数据冲突大概路不会发生,先操作数据,再进行检查。
  • 实践:在每次更新数据时,先获取当前数据的版本号或时间戳,然后在更新时比对版本号或时间戳是否一致,若一致则更新成功,否则表示数据已被其他线程修改,更新失败。
  • 优点:无锁无阻塞,并发性能高。
  • 缺点:需扩展额外字段,增加内存空间。