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事务的使用相关推荐

  1. yii mysql 事务处理_Yii2中事务的使用实例代码详解

    前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...

  2. django安装mysql驱动_django安装mysql驱动

    django目前支持三种mysql驱动来进行mysql的链接MySQLdb is a native driver that has been developed and supported for o ...

  3. mysql nodejs begin_nodejs中mysql用法

    nodejs也算是一篇脚本了我们来看nodejs如何使用mysql数据库了有了它们两组合感觉还是非常的不错哦,下面一起来看nodejs中使用mysql数据库的示例,希望能够帮助到各位. db-mysq ...

  4. freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区

    Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...

  5. mysql数据库连接javaweb_javaweb中mysql数据库连接方法

    一.直接连接,不封装到工具类中,主要步骤: 先导包:mysql-connector-java-5.0.8-bin.jar(点击跳转到下载界面),放在WebRoot/WEB-INF/lib/下 1.加载 ...

  6. linux连接本机mysql数据库,Linux中MySQL连接本机数据库客户端

    Linux中MySQL连接本机数据库客户端 Linux中MySQL连接本机数据库客户端 1.登入mysql数据库 2.找到要修改的位置 // 选定要用的数据库(用show databases;看完再u ...

  7. 独立mysql安装,LAMP中mysql独立安装

    1,mysql下载官网下载mysql稳定版安装包到本地5.7(一般找次新版本即较稳定) 2,xshell连接服务器,进入目录src下(cd /usr/local/src),上传本地包到服务器(rz), ...

  8. django mysql 时区_django 中的时区设置

    在settings.py中设置了 TIME_ZONE = 'Asia/Shanghai' USE_TZ = True 现在的北京时间是 22点35分.django shell 中运行 timezone ...

  9. mysql事务处理什么意思_mysql事务是什么意思

    mysql事务是一组原子性的SQL查询,或者说一个独立的工作单元,事务内的语句,要么全部执行成功,要么全部执行失败:事务需要符合"原子性"."一致性".&quo ...

最新文章

  1. Windows 10 Anaconda Python 3.7 安装 MXNet GPU版
  2. Ruby之父:写Ruby时工作特别闲,总加班的人很难做出创造
  3. 全球IPv6网络6月6日正式启动
  4. 我的SharpDevelop插件之一:知识管理器(2006年博客迁移)
  5. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
  6. 英特尔核显自定义分辨率_让免费的核显更好用!英特尔酷睿集成的GPU如何优化?...
  7. Oracle数据库基本操作
  8. 2017.10.17笔记
  9. 基于Matlab的车牌号识别
  10. Docker 安装及镜像加速器配置
  11. 微信连WiFi关注公众号流程更新 解决ios微信扫描二维码不关注就能上网的问题
  12. 计算机保研面试之专业课如何复习?
  13. ChatGPT讲故事,DALLE-2负责画出来!两大AI合作出绘本!
  14. docker容器和镜像的区别
  15. vs2013 编译 该文件已在源编辑器之外被修改
  16. authorization权限控制_授权(Authorization)
  17. 中国地面气候资料日值数据集(V3.0)
  18. 如何在Adobe Reader中存储阅读的Session
  19. CentOS 7部署Oracle数据库
  20. Dynamics AX2012 AOT同步到VS

热门文章

  1. [原创]状态值在数据库中的检索
  2. oracle数据库导入_oracle数据库导入数据
  3. Javascript高级程序设计第二版第十二章--Event--笔记
  4. 安装Ubuntu之后一定要安装Docky
  5. SQL Server 2005 高级程序设计 学习笔记(2)
  6. Java并发编程之FutureTask源码解析
  7. alertdialog android api 11,android – 设备api级别11的DialogFragments
  8. [转载] 弄懂JDK、JRE和JVM到底是什么
  9. mba学什么书_MBA的完整形式是什么?
  10. java中get接口示例_Java即时类| 带示例的get()方法