django中數據庫事物的管理

事務(Transaction)是併發控制的基本單位。所謂事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。例如,銀行轉賬工做:從一個賬號扣款並使另外一個賬號增款,這兩個操做要麼都執行,要麼都不執行。因此,應該把他們當作一個事務。事務是數據庫維護數據一致性的單位,在每一個事務結束時,都能保持數據一致性。數據庫

在django1.8中事務的使用  注意:只要是已報異常,程序就自動回滾了。。django

from django.db import transaction
#首先要導包
@transaction.atomic
@innerdef list(request):
    post= request.POST
    address = post.get('email')
    cart_id=post.getlist('cart_id')

    # 在調用一個view裏面的方法以前,django開始一個事務若是發出的響應沒有問題,
    # Django就會提交這個事務。若是在view這裏產生一個異常,Django就會回滾此次事務
    # 開啓事物保護
    sid = transaction.savepoint()
    try:
        # 1.創建新的訂單信息
        # transaction.savepoint_commit(sid)  #事物的提交
        order = OrderInfo()
        now = datetime.now()
        uid = request.session['user_id']
        order.oid=('%s%d')%(now.strftime('%Y%m%d%H%M%S'), uid)  # 拼接字符代碼
        order.user_id=uid
        order.udate = now
        order.oaddress = address
        print(order.oaddress,order.udate,order.user_id,order.oid,uid,now)
        order.otatal=0
        order.save()
        total=0  # 計算好的總價
        for cid in cart_id:
            cart=CartInfo.objects.get(pk=cid)
            # 2.判斷庫存,減小數據庫庫存
            if cart.goods.gkucun>=cart.count:
                cart.goods.gkucun-=cart.count
                cart.goods.save()         # 連表保存數據庫的值
                # 把信息添加訂單
                datail = OrderDetailInfo()
                datail.order=order        # 保存的外鍵對應ID
                datail.goods=cart.goods          #保存外鍵對應Id
                datail.price=cart.goods.gprice
                datail.count=cart.count
                # print(order,cart.goods,cart.goods.gprice)

                datail.save()
                # 計算總價
                total+=cart.goods.gprice*cart.count
                # 購車用完了刪除
                cart.delete()
            else: # 購車數量比庫存大
                transaction.savepoint_rollback(sid) #事務的回滾
                return redirect('/cart/')
        order.ototal = total
        print(total)
        order.save() # 計算完了 保存總價格
        transaction.savepoint_commit(sid) #提交事務的邏輯
        return redirect('/user/order/1')

    except :
        # 發生異常就回滾
        transaction.savepoint_rollback(sid)
相關文章
相關標籤/搜索