悲观锁:操作前先把资源锁住,别人要用得等你用完再说。
乐观锁:不加锁,但在提交前会检查数据有没有被别人修改过,如果改过就不提交。
悲观锁是“先上锁再做事”,乐观锁是“做事前先问问有没有人动过”。
截取部分代码分析
代码功能:两个用户同时提交订单买同一个东西,系统使用乐观锁处理。假设有三件物品,这两个用户都想要三个,分给谁
for id,count in carts.items():for i in range(10):sku=SKU.objects.get(pk=id)if sku.stock < count:#返回库存不够#记录旧的库存量oldStock=sku.stock#记录新的库存和销量newStock=sku.stock -countnewSales=sku.sales +count#只有我看到的库存没被人改过,我才能改#只有第一个提交 SQL 的人能成功#第二个因为 stock 已经不等于 oldStock,update 语句就更新失败(res==0)res=SKU.objects.filter(id=id,stock=oldStock).update(stock=newStock,sales=newSales)if res==0:sleep(0.7)#如果失败,重新执行continueelse:#执行成功后的处理breakreturn JsonResponse({'code':0,'errmsg':'ok','order_id':order_id})