celery异步定时任务怎么实现订单定时回滚
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要介绍"celery异步定时任务怎么实现订单定时回滚"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"celery异步定时任务怎么实现订单定时回滚"文章
千家信息网最后更新 2024年11月11日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安全错误
数据库的锁怎样保障安全
苏州在事业单位做软件开发
专业抢单软件开发
数据库表中id是什么
数据库如何用desc
erick 数据库
wow已从服务器断开
福建网络技术工程
网络安全毕业课题
dell 数据库
文件已发送但收不到数据库
为什么要做数据库还原操作
嘉兴app软件开发有哪些公司
有实力的软件开发培训
怎样做数据库
数据库有哪些gb规范引用
江苏南通万千网络技术有限公司
北大有什么金融数据库
我的世界进不去一个人的服务器
大疆调参软件开发者模式
高德地图开启服务器提醒会怎么样
深圳市小易互联网科技有限公司
娱网棋牌 服务器
淘宝网一共有多少服务器
奉贤区新能源软件开发价格查询
天津机电软件开发公司
县级医院网络安全等级要求
什么叫数据库的管理系统
技嘉ud3r支持服务器内存条吗
无线网络安全设置实验结果
闵行区上门软件开发管理制度