订单回滚

用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. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-执行测试用例(16)

    执行测试用例 # -*- coding: utf-8 -*- # @Time : 2020/2/12 22:56 # @File : run_test_16.py # @Author: Hero Li ...

  2. SpringBoot webjars 映射

    添加静态资源映射 @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.a ...

  3. JavaScript设计模式一:工厂模式和构造器模式

    转自:http://segmentfault.com/a/1190000002525792 什么是模式 前阵子准备期末考试,挺累也挺忙的,实在闲不得空来更新文章,今天和大家说说javascript中的 ...

  4. ZOJ-1183-Scheduling Lectures

    可以用贪心求最小讲课次数,贪心策略也很好想,就是对于任意主题,能早讲就早讲.这种方案的讲课次数一定是最少的,但是不满意指标不一定是最小,然后再利用动态规划求在最少讲课次数前提下的最小不满意指标. 方法 ...

  5. Java的同步和异步

    同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同 ...

  6. idea运行时默认显示的index.jsp修改方法

    在web.xml中加入以下代码,然后重启服务器就可以了. <welcome-file-list> <welcome-file>这儿写你要显示的页面名称</welcome- ...

  7. 北京VS上海:“活着为了工作”还是“工作为了生活”?

    Costco开业你去现场了吗?人口普查似的排队场面对于上海人来说已经不稀奇,毕竟当新鲜的商品或是业态来到中国时,上海常常是第一站.但当Costco的新闻不断发酵的同时,在互联网的角落里也有一群人提出了 ...

  8. 查漏补缺:C++STL简述(容器部分)

    STL:是Standard Template Library的简称,中文译为标准模板库,是由惠普实验室开发的一系列软件的统称,现为C++的一部分,可分为容器(containers).迭代器(itera ...

  9. 从社交到IP 庞大手游玩家大军迈向社群化之路

    庞大手游玩家大军迈向社群化之路" title="从社交到IP 庞大手游玩家大军迈向社群化之路"> 移动互联网及相关智能设备的快速迭进,不仅改变了我们的生活方式,也彻 ...

  10. 安卓权威编程指南 -笔记(18章 处理assets)

    resources资源可以存储声音文件,但当处理多个音乐文件时,效率会很低. assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构.类似游戏这样需要加载大量图片和声音资源的应用通 ...