django 事务的使用以及解决线程强占
在保存订单数据中,涉及到多张表(OrderInfo、OrderGoods、SKU)的数据修改,
对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败。
开启事务的来两种方式:
1,使用使用事务的两种方式
''' from django.db import transaction @transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行 ... #使用with 装饰! from django.db import transaction def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 ... with transaction.atomic(): # 这部分代码会在事务中执行 ... '''
2,django设置了多个保存点用来回退事务以及提交事务操作!
from django.db import transaction # 创建保存点 save_id = transaction.savepoint() # 回滚到保存点 transaction.savepoint_rollback(save_id) # 提交从保存点到当前状态的所有数据库事务操作 transaction.savepoint_commit(save_id)
3,对查询的并发处理!
1),悲观锁
当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作
2),乐观锁
乐观锁并不是真实存在的锁,而是在更新的时候判断此时的库存是否是之前查询出的库存,
如果相同,表示没人修改,可以更新库存,否则表示别人抢过资源,不再执行库存更新
通常使用乐观锁来进行查询!
3)将下单的逻辑放到任务队列中(如celery),将并行转为串行,所有人排队下单。
比如开启只有一个进程的Celery,一个订单一个订单的处理。(速度较慢!)

浙公网安备 33010602011771号