在Django中實現數據庫的事務操作
在學習MySQL數據庫時,MySQL數據庫是支持原子操作的.
什么是數據庫的原子操作呢??打個比方,一個消費者在一個商戶里刷信用卡消費.
交易正常時,銀行在消費者的賬戶里減去相應的款項,在商戶的帳戶加上相應的款項.
但是如果銀行從消費者的賬戶里扣完錢之后,還未在商戶的帳戶里加上相應的款項時.
由於某些原因,系統或者數據庫出現異常了,那么此時錢已經從消費者的賬戶里扣除了,但是商戶的賬戶里卻沒有加上相應的款項,讓會讓商戶遭受損失.
這種情況下,最好的解決辦法就是使用數據庫的原子性操作.
如果數據庫使用了事務操作,當出現上面的操作異常時,待數據庫正常運行后,數據庫系統會把先前執行了一半的操作退回到這個操作之前的狀態,
這個通常稱為數據庫的回滾,也即數據庫的原子性操作.
Django中,正常的數據庫操作應該是原子性操作的.
在Django的ORM中,想使用事務操作時,要先導入一個Django的內置模塊
from django.db import transaction
首先創建一個項目test,項目中有一個應用app01.
項目的model為:
from django.db import models
class Userinfo(models.Model):
username=models.CharField("用戶名",max_length=32)
email=models.EmailField("郵箱",max_length=32)
class Group(models.Model):
title=models.CharField("組名",max_length=32)
配置好url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/',views.index),
]
路由對應的視圖函數為
from django.shortcuts import render,HttpResponse
from . import models
def index(request):
from django.db import transaction
try:
with transaction.atomic():
models.Userinfo.objects.create(username="python001",email="python001@qq.com")
models.Group.objects.create(title="python002")
except Exception as e:
return HttpResponse("出現錯誤....")
return HttpResponse("ok")
首在先瀏覽器中打開http://127.0.0.1:8000/index/,瀏覽器的頁面上出現

打開對應的數據庫可以看到,UserInfo數據表和Group數據表中已經添加一條記錄


現在修改視圖函數,使程序出現運行錯誤,
from django.shortcuts import render,HttpResponse
from . import models
def index(request):
from django.db import transaction
try:
with transaction.atomic():
models.Userinfo.objects.create(username="python001",email="python001@qq.com")
models.Group.objects.create(title="python002")
except Exception as e:
return HttpResponse("出現錯誤....")
return HttpResponse("ok")
再次刷新瀏覽器,可以看到

而刷新兩張數據表,可以看到兩張數據庫都沒有添加數據記錄.


這就是Django的ORM所支持的事務操作.!
