减库存要面临的问题及解决方案

问题

1. 并发问题

2. 重复请求

方案

1. 自减并判断库存是否存在,加锁解决重复请求问题

  • 可以解决并发,不能解决重复请求
update products set stock=stock-1 where id = 3 and stock >1

2. 对数据加锁,解决并发问题

  • 使用MySQL锁机制,对库存进行加锁,防止其他人读写。
  • 读多写少不推荐,性能差
select * from products where id =3 for update;
update products set stock=2 where id =3

锁机制

乐观锁

  • 对冲突抱有乐观态度,假设一般不会出现冲突
  • 在数据提交更新的时候,才会对数据的冲突进行检测,若冲突了则返回错误信息,让程序决定如何去做。
  • 适用于读多写少的场景
    常见做法CAS(compare and set),方案一就是乐观锁。

悲观锁

  • 对数据的冲突持有悲观态度。

  • 具有强烈的占有和排他性,直接对数据进行加锁已防止并发。
    方案二就是悲观锁

  • 悲观锁生效的条件:1、innoDB,2、处于事务块中。

    proxy_buffer_size 1024k;
    proxy_buffers 16 1024k;
    proxy_busy_buffers_size 2048k;
    proxy_temp_file_write_size 2048k;

评论