事務(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)