返回顶部
首页 > 资讯 > 后端开发 > Python >celery异步定时任务订单定时回滚
  • 152
分享到

celery异步定时任务订单定时回滚

2024-04-02 19:04:59 152人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录订单回滚控制执行(多少时间后执行)celery异步定时任务订单回滚 用celery异步,定时任务。可以设置:如果下单15分钟后没有支付,则取消订单。做反向操作 控制执行(多少时间

订单回滚

用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异步定时任务订单定时回滚 的详细内容,更多关于celery异步订单定时回滚任务的资料请关注编程网其它相关文章!

--结束END--

本文标题: celery异步定时任务订单定时回滚

本文链接: https://lsjlt.com/news/117306.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • celery异步定时任务订单定时回滚
    目录订单回滚控制执行(多少时间后执行)celery异步定时任务订单回滚 用celery异步,定时任务。可以设置:如果下单15分钟后没有支付,则取消订单。做反向操作 控制执行(多少时间...
    99+
    2024-04-02
  • celery异步定时任务怎么实现订单定时回滚
    这篇文章主要介绍“celery异步定时任务怎么实现订单定时回滚”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“celery异步定时任务怎么实现订单定时回滚”文章能帮助大家解决问题。订单回滚用celer...
    99+
    2023-06-30
  • Springboot 异步任务和定时任务的异步处理
    目录1 前言2 异步任务设置3 定时任务配置4 总结1 前言 在 Springboot 中,异步任务和定时任务是经常遇到的处理问题方式,为了能够用好这两项配置,不干扰正常的业务,需要...
    99+
    2024-04-02
  • Python Celery定时任务详细讲解
    目录前言一、Celery定时任务是什么?二、使用步骤1.代码结构2.启动定时任务3.执行结果总结前言 Celery在python中的应用除了实现异步任务(async task)外也可...
    99+
    2024-04-02
  • golang定时任务中异步回调怎么实现
    在golang中,可以使用goroutine和channel来实现异步回调。 下面是一个示例代码: package main im...
    99+
    2023-10-22
    golang
  • Django+Celery实现定时任务的示例
    目录一、前言二、配置使用定义与触发任务扩展三、Django中使用定时任务二次开发一、前言   Celery是一个基于python开发的分布式任务队列,而做python WEB开发最为...
    99+
    2024-04-02
  • celery实现动态设置定时任务
    本文实例为大家分享了celery动态设置定时任务的具体代码,供大家参考,具体内容如下 首先celery是一种异步任务队列,如果还不熟悉这个开源软件的请先看看官方文档,快速入门。 这里...
    99+
    2024-04-02
  • django-celery-beat搭建定时任务的实现
    目录一、创建django项目和app1、安装定时任务第三方包2、创建django项目并创建一个使用定时任务的app2、新建一个celery.py文件3、创建配置文件config.py...
    99+
    2023-03-21
    django 搭建定时任务 django-celery-beat 定时任务
  • 怎么用django-celery-beat搭建定时任务
    本篇内容主要讲解“怎么用django-celery-beat搭建定时任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用django-celery-beat搭建定时任务”吧!一、创建djan...
    99+
    2023-07-05
  • springboot定时任务和异步任务怎么实现
    这篇文章主要介绍“springboot定时任务和异步任务怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot定时任务和异步任务怎么实现”文章能帮助大家解决问题。异步任务简单案例...
    99+
    2023-06-27
  • SpringBoot2如何使用定时任务和异步任务
    这篇文章给大家分享的是有关SpringBoot2如何使用定时任务和异步任务的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、定时任务1、基本概念按照指定时间执行的程序。2、使用场景数据分析数据清理系统服务监控二、...
    99+
    2023-06-02
  • Springboot异步任务和定时任务如何处理
    本文小编为大家详细介绍“Springboot异步任务和定时任务如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot异步任务和定时任务如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1...
    99+
    2023-06-30
  • Celery 3 版本 定时执行与 异
    Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery。 软件架构 环境 * python3.6.4 * django ...
    99+
    2023-01-31
    版本 Celery
  • 怎么用Python Celery动态添加定时任务
    一、背景实际工作中会有一些耗时的异步任务需要使用定时调度,比如发送邮件,拉取数据,执行定时脚本通过celery 实现调度主要思想是 通过引入中间人redis,启动 worker 进行任务执行 ,celery-beat进行定时任务数据存储二、...
    99+
    2023-05-14
    Python Celery
  • 使用celery怎么动态设置定时任务
    使用celery怎么动态设置定时任务?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。celery的beat运行过程。上图是beat的主要组成结构,beat中包含了...
    99+
    2023-06-08
  • PHP定时任务实现:每10分钟取消订单操作步骤
    标题:PHP定时任务实现:每10分钟取消订单操作步骤 在电商平台或者在线交易网站中,订单的处理是一个重要的环节。有时候可能会遇到用户下单后长时间不付款或者其他原因导致订单需要被取消。为...
    99+
    2024-03-01
    php 定时任务 取消订单 php脚本
  • 详解Springboot中的异步、定时、邮件任务
    目录一、异步任务1、编写一个类AsyncService 2、编写一个AsyncController类3、开启异步二、邮件任务1、引入依赖2、配置mail3、测试三、定时任务1、编写一...
    99+
    2024-04-02
  • 如何使用Python Celery动态添加定时任务
    本篇内容介绍了“如何使用Python Celery动态添加定时任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、背景实际工作中...
    99+
    2023-07-06
  • Android中关于定时任务实现关闭订单问题
    目录一、定时任务关闭订单(最low)二、rocketmq延迟队列方式三、rabbitmq死信队列的方式四、时间轮算法五、redis过期监听在电商、支付等领域,往往会有这样的场景,用户...
    99+
    2024-04-02
  • springboot中swagger、异步/定时/邮件任务的问题
    目录1、SpringBoot:集成Swagger终极版1.1、Swagger简介1.2、SpringBoot集成Swagger1.3、配置Swagger1.4、配置扫描接口1.5、配...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作