一.乐观锁结果并发下单问题
1.查询商品
查询原有库存
查询原有销量
2.以商品和原有库存作为条件,用result接收结果,result=0,表示被修改,下单失败,若不等于零表示原始库存中途未被修改,则更新库存和销量
3.如果遇到网络信号不好,那么用户只买一个但是库存100时也会下单失败
购买成功包括两点:
库存大于购买商品数
库存没有被他人修改
4.所以使用无线循环,如果库存被改动,循环下单,直到库存不足,跳出循环
5.事务隔离级别决定了是否能查到已被修改后的库存数据
所以修改事务隔离级别为Read committed读取已提交
#循环下单直到库存不足
while True:
#查询商品
sku=SKU.object.get(id=sku_id)
#查询商品原始库存
origin_stock=sku.stock
origin_sales=sku.sales
.....其他操作
#乐观锁更新数据库销量
new_stock=origin_stock - sku_count
new_sales=origin_sales + sku_count
result=SKU.objects.fllter(id=sku_id,sku.stock=origin_stock)
.update(stock=new_stock,sales=new_sales)
#如果下单失败但是库存足够,继续下单,直到下单成功
if result==0:
continue
#下单成功跳出循环
break
二.修改事务隔离级别
MySQL事务隔离级别修改
隔离级别指,在处理同一个数据的多个事务中,一个事务修改数据后,其他事务能否看到修改后结果
默认使用可重复读( Repeatable read)。
修改:
cd /etc/mysql/mysql.conf.d/
ls
sudo vim mysql.cnf
105 transaction-isolation=Read committed
Read committed:读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值