订单回滚

用celery异步,定时任务。可以设置:如果下单15分钟后没有支付,则取消订单。做反向操作

控制执行(多少时间后执行)

from datetime import datetime
from pro_celery.celery import del_order
def pay_status(order_id,check_time=5): # 5秒后
ctime = datetime.now()
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
from datetime import timedelta
#seconds参数表示多少秒后执行
time_delay = timedelta(seconds=check_time)
time_task = utc_ctime+ time_delay
#提交任务给del_order,让他多久后执行
res = del_order.apply_async(args = [order_id,],eta= time_task)

celery异步定时任务

此任务是如果下单5秒后没有支付,则取消订单。做反向操作。库存再次添加到数据库。
注意:考虑到了并发量一多会出现零界点小概率事件,在执行库存加到数据库中的哪一行代码,用户立马支付了。
出现的后果:用户支付了,库存却加到数据库中了,订单也没有了。
如何避免:在事务里面判断影响的行数,如果影响行数为1,证明取消订单成功,可以commit。
如果没有影响行数,证明用户在这一刻支付成功,回滚数据 # 一定要判断pay_status,防止途中完成支付
row = models.Order.objects.filter(order_id = order_id,pay_status=0).update(status = "dead")
if row:
transaction.savepoint_commit(sid)
else:
transaction.savepoint_rollback(sid)
import celery
import time
backend = "redis://127.0.0.1:6379/1"
broker = "redis://127.0.0.1:6379/2" cel = celery.Celery("test",backend=backend,broker = broker) import os,sys
import django
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #定位到你django的根目录
sys.path.append(os.path.abspath(BASE_DIR))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shopapi.settings")
django.setup()
from django.db import transaction @cel.task
@transaction.atomic
def del_order(order_id):
#要通过数据库来查当前order_id的订单状态,如果没有支付,我们要操作库存,并且取消订单
from app01 import models
# 查询订单
data = models.Order.objects.filter(order_id = order_id,pay_status=0).first()
#如果data没有,表示以及支付成功,无需操作,反之要回滚库存
if data:
# 回滚哪些商品的库存,回滚多少?从哪里知道order_item中看
item_data = models.Order_items.objects.filter(order_id =order_id).values("product","nums")
# item_data-->[{'product':1,'nums":2},{product':2,'nums":1}]
all_product_dict = {k["product"] :k["nums"] for k in item_data}
#{1:2,2:2}
all_product_id = list(all_product_dict.keys())
all_product = models.Product.objects.filter(product_id__in = all_product_id) #开启事务
sid = transaction.savepoint()
for product in all_product:
for i in range(3):
stock = product.stock.quantity
new_stock = stock + all_product_dict[product.product_id]
#用了乐观锁
res = models.Stock.objects.filter(quantity=stock,stock_id=product.stock.stock_id).update(quantity=new_stock)
if not res:
if i==2:
transaction.savepoint_rollback(sid)
from app01.func import function_tool
function_tool.pay_status(order_id,1)
return
else:
continue
else:
break
new_buy_cont = product.buy_count-all_product_dict[product.product_id]
models.Product.objects.filter(product_id = product.product_id).update(buy_count = new_buy_cont)
# 一定要判断pay_status,防止途中完成支付
row = models.Order.objects.filter(order_id = order_id,pay_status=0).update(status = "dead")
if row:
transaction.savepoint_commit(sid)
else:
transaction.savepoint_rollback(sid)

celery订单定时回滚的更多相关文章

  1. 递归与树的写法-多种支付的设计-支付的接通-celery订单的回退实现

    递归与树的写法 data: data=[ {"cat_id":1,"name":"北京","parent_id":0}, ...

  2. btrfs-snapper 实现Linux 文件系统快照回滚

    ###btrfs-snapper 应用 ----------####环境介绍> btrfs文件系统是从ext4过渡而来的被誉为“下一代的文件系统”.该文件系统具有高扩展性(B-tree).数据一 ...

  3. 【原】关于定时回查出现的BUG有感

    前言:今天有同事反映说客户在平台投标后,看到的是失败状态,但是钱在某银行的状态是被冻结了,我这边给出答复是只有投标成功才会冻结. 首先写下流程:P2P对接某银行托管,某银行的部分接口要求我们通过同步回 ...

  4. 如何回滚请求<复制系统初始的数据>所处理的数据

    一.    问题提出 请求名称:复制系统初始的数据 参数:空 问题: 今天早上财务实施人员新配置了一个OU,然后在跑复制系统初始的数据报表的时候,不小心,不输入参数就直接跑. 报表先是报错. 接下来的 ...

  5. 2、jenkins+svn自动发布和回滚

    Jenkins配置回滚思路: 目前只能实现使用salt来管控配置文件的管控,配置文件的版本回滚需要后续定制化开发,或者进行格外其他的管理操作.后续实现 以下配置可以为每个项目备份构建文件到本地指定路径 ...

  6. Django数据库--事务及事务回滚

    数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作.Django的ORM在事务方面也提供了不少的API.有事务出错的整体回滚操作,也有基于保存点的部分回滚 ...

  7. [转] C# mysql 事务回滚

    什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...

  8. thinkphp curd的事务回滚 一看就会

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/32314403     /**       ...

  9. 如何在mysql下实现事务的提交与回滚

    最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制. 首先我们建一张tran_test表 CREATE TABLE ...

随机推荐

  1. Java反射的应用 --- 内省

    一.基础概念 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法.Java JDK中提供了一套 API 用来访问某个属性的 getter/sette ...

  2. JS数组去重算法

    思路: 1.创建一个新的数组存放结果 2.创建一个空对象 3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为 ...

  3. Android中的AlertDialog和ProgressDialog用法

    手机APP对话框是很多APP都有的下面来看下怎么实现的吧, 打开Android studio 然他自动创建好布局和类; 下面我们修改activity_main.xml中的代码 <?xml ver ...

  4. python基础函数、方法

    python的函数和方法,通过def 定义: 函数的特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 函数和方法的区别:函数有返回值.方法没有 语法定义: def sayhi():#函数名 p ...

  5. python基础修改haproxy配置文件

    1.通过eval(),可以将字符串转为字典类型. 2.Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数.两个函数的唯一区别就是dump把py ...

  6. C++求解N阶幻方

    由一道数学题的联想然后根据网上的做法瞎jb乱打了一下,居然对了代码精心附上了注释,有兴趣的童鞋可以看一看..不说了,上代码!(自认为结构很清晰易懂) 1234567891011121314151617 ...

  7. http2.0与WebSocket的关系是怎么样的

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议.在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议.WebSock ...

  8. 全平台Markdown笔记软件——Notable

    简介 The markdown-based note-taking app that doesn't suck. 一款简介.跨平台的本地笔记软件,github地址:https://github.com ...

  9. 在没有APP的125年前 印度的外卖小哥是这样送餐

    说到印度,你想到的是什么?咖喱.歌舞剧.开挂的火车?通通不是,我今天要说的是他们的外卖小哥,在印度如同"神"一般的存在.其实印度人不叫这批人为外卖小哥,而称他们为dabbawala ...

  10. 2018 ACM 国际大学生程序设计竞赛上海大都会赛

    传送门:2018 ACM 国际大学生程序设计竞赛上海大都会赛 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛2018-08-05 12:00:00 至 2018-08-05 17:00:0 ...