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 ...
随机推荐
- java面试题 - 框架
1.servlet执行流程 客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request.resp ...
- 吴裕雄--天生自然python学习笔记:Python3 MySQL 数据库连接 - PyMySQL 驱动
什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...
- 吴裕雄--天生自然python学习笔记:Python3 模块
Python3 模块 在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办 ...
- JAVAscript的DOM操作及实例
一.Windows对象操作 (1)用代码打开窗口:window.open("第一部分","第二部分","第三部分","第四部分&q ...
- maven工程根项目运行ok但是子项目就报错的解决办法
正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了 没有配置1.8 所以会出现莫明其妙的bug
- Java多态详解
package QianFeng02; //多态 public class Polymorphic { public static void main(String[] args){ // HomeC ...
- ubuntu 16 下安装 Ubuntu Make
第一步:下载安装包 地址:http://ftp.gnu.org/gnu/make/ 第二步:解压 先进入存放文件目录,图示: 进行解压,图示: 解压并copy到安装目录 第三步:编译 1.查看目录, ...
- 一、HTTP和HTTPS的基本概念
1HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. 2HT ...
- windows应用程序单实例
前言 这才第几天博客就跟不上了,看来一天一篇博客的目标还是有点大,写博客还是挺费时间的,写了不满意删,删完再写...直到自己没了耐心.今天先写个前言,实质性的内容明天再补吧.今天一天的收获还是挺多的, ...
- Design Patterns 25
尽管将一个系统分割成许多对象通常可以增加其可服用性, 但是对象间相互连接的激增又会降低其可复用性了. 大量的连接使得一个对象不可能在没有改变其他对象的支持下工作, 系统表现为一个不可分割的整体, 所以 ...