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,一个订单一个订单的处理。(速度较慢!)
posted @ 2018-07-03 09:43  十七楼的羊  阅读(216)  评论(0)    收藏  举报