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事务的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python偶数列表_使用条件偶数列表创
- 下一篇: sap生产工单报工_SAP系统PP (