celery订单定时回滚
订单回滚
用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订单的回退实现
递归与树的写法 data: data=[ {"cat_id":1,"name":"北京","parent_id":0}, ...
- btrfs-snapper 实现Linux 文件系统快照回滚
###btrfs-snapper 应用 ----------####环境介绍> btrfs文件系统是从ext4过渡而来的被誉为“下一代的文件系统”.该文件系统具有高扩展性(B-tree).数据一 ...
- 【原】关于定时回查出现的BUG有感
前言:今天有同事反映说客户在平台投标后,看到的是失败状态,但是钱在某银行的状态是被冻结了,我这边给出答复是只有投标成功才会冻结. 首先写下流程:P2P对接某银行托管,某银行的部分接口要求我们通过同步回 ...
- 如何回滚请求<复制系统初始的数据>所处理的数据
一. 问题提出 请求名称:复制系统初始的数据 参数:空 问题: 今天早上财务实施人员新配置了一个OU,然后在跑复制系统初始的数据报表的时候,不小心,不输入参数就直接跑. 报表先是报错. 接下来的 ...
- 2、jenkins+svn自动发布和回滚
Jenkins配置回滚思路: 目前只能实现使用salt来管控配置文件的管控,配置文件的版本回滚需要后续定制化开发,或者进行格外其他的管理操作.后续实现 以下配置可以为每个项目备份构建文件到本地指定路径 ...
- Django数据库--事务及事务回滚
数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作.Django的ORM在事务方面也提供了不少的API.有事务出错的整体回滚操作,也有基于保存点的部分回滚 ...
- [转] C# mysql 事务回滚
什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...
- thinkphp curd的事务回滚 一看就会
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/32314403 /** ...
- 如何在mysql下实现事务的提交与回滚
最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制. 首先我们建一张tran_test表 CREATE TABLE ...
随机推荐
- js各继承方法的优缺点
在js中有很多种继承的方法,下面总结这些方法的优缺点. ####1.原型链继承 优点: 非常纯粹的继承关系,实例是子类的实例,也是父类的实例 父类新增原型方法/原型属性,子类都能访问到 简单,易于实现 ...
- Java入门级文件下载_学习笔记
文件下载和上一篇文件上传很像,就不多说了,传一个我写的一个下载歌曲的代码: 下面是Servlet代码: public class DownLoadServlet extends HttpServlet ...
- mvn相关介绍和命令
1.前言 Maven,发音是[`meivin],"专家"的意思.它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项目完全迁移并应用maven ...
- Java 获取Enumeration类型的集合
学习到java的io流中关于序列流SequenceInputStream使用,其中把3个以上的流串联起来操作, 使用的参数是生成运行时类型为 InputStream 对象的 Enumeration 型 ...
- Rancher安装多节点高可用(HA)
Rancher版本:Rancher v1.0.1 基本配置需求 多节点的HA配置请参照单节点需求 节点需要开放的端口 全局访问:TCP 端口22,80,443,18080(可选:用于在集群启动前 查看 ...
- IOUtils和FileUtils的学习笔记
pom文件导入依赖import org.apache.commons.io.FileUtils; <dependency> <groupId>commons-io</gr ...
- 吴裕雄--天生自然KITTEN编程:青蛙答题过河
- 视频播放插件JWPlayer的使用
JwPlayer 简介 JW Media Player是一个开源的在网页上使用的Flash视频.音频以及图片播放器,支持 Sliverlight 播放,支持H.264 ( .mp4, .mo ...
- ES6中 const 关键字
const声明一个只读的常量.一旦声明,常量的值就不能改变. 定义后可以使用但不能修改 但是,const 定义的对象可能与我们想象的不太一样 定义了对象b ,我们可以在b上添加修改属性,再看一个列子 ...
- Nginx+PHP配置错误,日志:[error] 24324#0: *31 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
一.问题现象 1.安装nginx.php.php-fpm后,浏览器访问php报错,“File not found”: 二.问题排查 1.检查nginx.php-fpm服务是否正常启动,均正常启动: 2 ...