django使用mysql事务处理_Django中MySQL事务的使用
Django中事物的使用
from django.db import transaction
@transaction.atomic
通过transaction的@transaction.atomic装饰器来开启事务,在视图逻辑涉及数据库操作的地方添加事物保存点,在操作不满足时进行事物回滚,在操作满足是进行事物提交
# 前端传递的参数:地址id(addr_id) 支付方式(pay_method) 用户要购买的商品id字符串(sku_ids)
# mysql事务: 一组sql操作,要么都成功,要么都失败
# 高并发:秒杀
# 支付宝支付
class OrderCommitView(View):
'''订单创建'''
@transaction.atomic
def post(self, request):
'''订单创建'''
# 判断用户是否登录
user = request.user
if not user.is_authenticated():
# 用户未登录
return JsonResponse({'res': 0, 'errmsg': '用户未登录'})
# 接收参数
addr_id = request.POST.get('addr_id')
pay_method = request.POST.get('pay_method')
sku_ids = request.POST.get('sku_ids')
# 校验参数
if not all([addr_id, pay_method, sku_ids]):
return JsonResponse({'res': 1, 'errmsg': '参数不完整'})
# 校验支付方式
if pay_method not in OrderInfo.PAY_METHODS.keys():
return JsonResponse({'res': 2, 'errmsg': '不支持的支付方式'})
# 校验地址
try:
addr = Address.objects.get(id=addr_id)
except Address.DoesNotExist:
# 地址不存在
return JsonResponse({'res': 3, 'errmsg': '地址非法'})
# todo:创建订单核心业务
#组织参数
#订单id:20190416222615+用户id
order_id = datetime.now().strftime('%Y%m%d%H%M%S')+str(user.id)
# 运费
transit_price = 10
# 总数目和总金额
total_count = 0
total_price = 0
# 设置事务保存点
save_id = transaction.savepoint()
try:
# todo: 向df_order_info表中添加一条记录
order = OrderInfo.objects.create(order_id=order_id,
user=user,
addr=addr,
pay_method=pay_method,
total_count=total_count,
total_price=total_price,
transit_price=transit_price)
# todo: 用户的订单中有几个商品,需要向df_order_goods表中加入几条记录
conn = get_redis_connection('default')
cart_key = 'cart_%d' % user.id
sku_ids = sku_ids.split(',')
for sku_id in sku_ids:
# 获取商品的信息
try:
sku = GoodsSKU.objects.get(id=sku_id)
except:
# 商品不存在,进行事物回滚
transaction.savepoint_rollback(save_id)
return JsonResponse({'res': 4, 'errmsg': '商品不存在'})
# 从redis中获取用户所要购买的商品数量
count = conn.hget(cart_key, sku_id)
# todo: 判断商品的库存
if int(count) > sku.stock:
# 库存不足,进行事物回滚
transaction.savepoint_rollback(save_id)
return JsonResponse({'res': 6, 'errmsg': '商品库存不足'})
# todo: 向df_order_goods表中添加一条记录
OrderGoods.objects.create(order=order,
sku=sku,
count=count,
price=sku.price)
# todo: 更新商品的库存和销量
sku.stock -= int(count)
sku.sales += int(count)
sku.save()
# todo: 累加计算订单商品的总数量和总价格
amount = sku.price*int(count)
total_count += int(count)
total_price += amount
# todo: 更新订单信息表中的商品的总数量和总价格
order.total_count = total_count
order.total_price = total_price
order.save()
except Exception as e:
transaction.savepoint_rollback(save_id)
return JsonResponse({'res': 7, 'errmsg': '下单失败'})
# 提交事务
transaction.savepoint_commit(save_id)
# todo: 清除用户购物车中对应的记录
conn.hdel(cart_key, *sku_ids)
# 返回应答
return JsonResponse({'res': 5, 'message': '创建成功'})
django使用mysql事务处理_Django中MySQL事务的使用相关推荐
- yii mysql 事务处理_Yii2中事务的使用实例代码详解
前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...
- django安装mysql驱动_django安装mysql驱动
django目前支持三种mysql驱动来进行mysql的链接MySQLdb is a native driver that has been developed and supported for o ...
- mysql nodejs begin_nodejs中mysql用法
nodejs也算是一篇脚本了我们来看nodejs如何使用mysql数据库了有了它们两组合感觉还是非常的不错哦,下面一起来看nodejs中使用mysql数据库的示例,希望能够帮助到各位. db-mysq ...
- freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区
Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...
- mysql数据库连接javaweb_javaweb中mysql数据库连接方法
一.直接连接,不封装到工具类中,主要步骤: 先导包:mysql-connector-java-5.0.8-bin.jar(点击跳转到下载界面),放在WebRoot/WEB-INF/lib/下 1.加载 ...
- linux连接本机mysql数据库,Linux中MySQL连接本机数据库客户端
Linux中MySQL连接本机数据库客户端 Linux中MySQL连接本机数据库客户端 1.登入mysql数据库 2.找到要修改的位置 // 选定要用的数据库(用show databases;看完再u ...
- 独立mysql安装,LAMP中mysql独立安装
1,mysql下载官网下载mysql稳定版安装包到本地5.7(一般找次新版本即较稳定) 2,xshell连接服务器,进入目录src下(cd /usr/local/src),上传本地包到服务器(rz), ...
- django mysql 时区_django 中的时区设置
在settings.py中设置了 TIME_ZONE = 'Asia/Shanghai' USE_TZ = True 现在的北京时间是 22点35分.django shell 中运行 timezone ...
- mysql事务处理什么意思_mysql事务是什么意思
mysql事务是一组原子性的SQL查询,或者说一个独立的工作单元,事务内的语句,要么全部执行成功,要么全部执行失败:事务需要符合"原子性"."一致性".&quo ...
最新文章
- Windows 10 Anaconda Python 3.7 安装 MXNet GPU版
- Ruby之父:写Ruby时工作特别闲,总加班的人很难做出创造
- 全球IPv6网络6月6日正式启动
- 我的SharpDevelop插件之一:知识管理器(2006年博客迁移)
- 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
- 英特尔核显自定义分辨率_让免费的核显更好用!英特尔酷睿集成的GPU如何优化?...
- Oracle数据库基本操作
- 2017.10.17笔记
- 基于Matlab的车牌号识别
- Docker 安装及镜像加速器配置
- 微信连WiFi关注公众号流程更新 解决ios微信扫描二维码不关注就能上网的问题
- 计算机保研面试之专业课如何复习?
- ChatGPT讲故事,DALLE-2负责画出来!两大AI合作出绘本!
- docker容器和镜像的区别
- vs2013 编译 该文件已在源编辑器之外被修改
- authorization权限控制_授权(Authorization)
- 中国地面气候资料日值数据集(V3.0)
- 如何在Adobe Reader中存储阅读的Session
- CentOS 7部署Oracle数据库
- Dynamics AX2012 AOT同步到VS
热门文章
- [原创]状态值在数据库中的检索
- oracle数据库导入_oracle数据库导入数据
- Javascript高级程序设计第二版第十二章--Event--笔记
- 安装Ubuntu之后一定要安装Docky
- SQL Server 2005 高级程序设计 学习笔记(2)
- Java并发编程之FutureTask源码解析
- alertdialog android api 11,android – 设备api级别11的DialogFragments
- [转载] 弄懂JDK、JRE和JVM到底是什么
- mba学什么书_MBA的完整形式是什么?
- java中get接口示例_Java即时类| 带示例的get()方法