日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

django使用mysql事务处理_Django中MySQL事务的使用

發布時間:2025/3/11 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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事务的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。