订单的并发问题:(秒杀活动)
订单并发数据库操作的锁的问题!
悲观锁:如同Python中的GIL;只能有一个操作可运行,其他需要等待;
Python与mysql:
Models.objects.select_for_update().get(id=1)
sql语句:
select * from models where id = 1 for update;
乐观锁: 不是加锁,,,判断更新时的库存和之前查出的库存是否一致
sk = Models.objects.filter(id=1)
orgin_stock = sk.stock
new_stock = orgin_stock - int(count)
new_sales = sk.sales + int(count)
res = Models.objects.filter(id=1, stock=orgin_stock).update(
stock=new_stock,
sales=new_sales)
# res是返回被修改的行数;
if res == 0:
# 说明下单失败,需要进行事务的回滚
return JsonResponse({"res": 7, "errmsg": "下单失败"})
对于乐观锁,一旦有更新,就会失败。所以需要进行循环的判断,不过循环要有次数限制;
由于MySQL的事务隔离性存在,也会出现错误的问题;
需要修改MySQL的配置文件,修改mysql 的事务的隔离级别:
如果冲突比较少的时候,可以使用乐观锁!
python --- 订单并发问题
最新推荐文章于 2023-11-21 19:12:10 发布