celery异步定时任务怎么实现订单定时回滚
发表于:2024-11-13 作者:千家信息网编辑
千家信息网最后更新 2024年11月13日,这篇文章主要介绍"celery异步定时任务怎么实现订单定时回滚"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"celery异步定时任务怎么实现订单定时回滚"文章
千家信息网最后更新 2024年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安全错误
数据库的锁怎样保障安全
三调数据库图斑字母代表什么
面对网络安全问题你会怎做
宜宾软件开发方案
mqtt 服务器开发
广州58同城软件开发兼职
数据库按存储信息分类
广东超频服务器销售
上海网络安全大师
5g网络技术人才实习生靠谱吗
sql数据库申请
郑州正规软件开发服务
oppo诛仙哪个服务器最火
网络安全需要写源代码吗
ftp服务器传输到客户计
隐私性属于网络安全的特征
数据库sql语句截取
如何在数据库中查询数据库
河南现代软件开发资费
云服务器监控管理
福州天睿网络技术有...
网络安全教育作业好多
软件开发人月怎么算
5g网络技术人才实习生靠谱吗
网络安全常识与防范
更新数据库损坏
qq王者荣耀服务器哪个好
网络安全法终身劳改
服务器做阵列
方舟宝可梦服务器怎么开
中山软件开发公司实习生