处理并发问题时,常见的方式就是悲观锁和乐观锁
悲观锁的处理方法可以理解为在一个进程中执行数据操作的时候进行加锁操作,并只有事务结束时,锁才能释放,另一个进程才能执行才能执行这个相同的数据操作。
django中使用orm实现悲观锁的添加通过select_for_update()方法
# select * from df_goods_sku where id=sku_id for update;
sku = GoodsSKU.objects.select_for_update().get(id=sku_id)
乐观锁的处理方式可以理解为在进行数据操作时不加锁,在进行数据更新时进行判断,判断更新时的数据和之前的数据是否一致,如果不一致说明已被其他进程先进行操作
django中使用orm实现悲观锁的添加通过update方法,以之前的数据作为更新的查询条件,如果不满足则返回0,考虑到其他进程并发提交订单时之前的查询数据可能已经被更新掉(例如商品库存为5件,A购买了1件,B购物了一件,两人在执行查询之前数据是库存都为5件,当A购买成功后,库存为4件,但B在执行更新时的查询条件还是5件,这就回导致查询库存明明够但还是无法实现更新,因为查询条件(之前的查询数据)发生了改变,所以需要当一次查询更新失败后需要进行循环重新查询库存)
<