celery异步定时任务怎么实现订单定时回滚
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍"celery异步定时任务怎么实现订单定时回滚"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"celery异步定时任务怎么实现订单定时回滚"文章
千家信息网最后更新 2025年11月13日celery异步定时任务怎么实现订单定时回滚
这篇文章主要介绍"celery异步定时任务怎么实现订单定时回滚"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"celery异步定时任务怎么实现订单定时回滚"文章能帮助大家解决问题。
订单回滚
用celery异步,定时任务。可以设置:如果下单15分钟后没有支付,则取消订单。做反向操作
控制执行(多少时间后执行)
from datetime import datetimefrom pro_celery.celery import del_orderdef 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 celeryimport timebackend = "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,sysimport djangoBASE_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.atomicdef 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异步定时任务怎么实现订单定时回滚"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
订单
支付
任务
库存
数据
数据库
成功
用户
知识
影响
事务
行业
不同
中看
实用
乐观
一刻
一行
事件
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术中的10ge
数据库链接地址怎么看
前端开发与软件开发哪个好
工控网络安全的重要性
数据库的近义词
学习网络安全对应要求高吗
mysql数据库技术答案在哪看
刑法网络安全法
计算机网络技术怎样
深圳新冠网络技术有限公司
网络安全人才需求看涨
杭州璧岐互联网科技有限公司
服务器母盘
乡 镇加强网络安全管理
甘肃华为服务器续保云主机
数据库大小写有没有影响
开源3d建模软件开发
ps5 gt赛车7 无法连接服务器
地理数据库
信息与网络安全专业技术人员
我国社会物流费用数据库
51模拟器怎样清除数据库
美国的网络安全法制体系
做软件开发现在前景咋样啊
64位数据库
甘肃华为服务器续保云主机
国开2021秋季数据库应用技术
连接p2p服务器有病毒吗
卡巴斯基换数据库
苏州上市公司服务器