Django中MySQL事务的使用
Django中事物的使用
1 | from django.db import transaction |
@transaction.atomic
通过transaction的@transaction.atomic装饰器来开启事务,在视图逻辑涉及数据库操作的地方添加事物保存点,在操作不满足时进行事物回滚,在操作满足是进行事物提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | # 前端传递的参数:地址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' : '创建成功' }) |
多思考也是一种努力,做出正确的分析和选择,因为我们的时间和精力都有限,所以把时间花在更有价值的地方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
2018-08-10 redis管道操作(事务),无回滚