標籤:cti 也會 復原 end style pattern objects 容錯 render
往資料庫寫入資料時,不經意間就會寫入不完整的資料,我們稱之為髒資料。交易管理(transaction)可以防止這種情況發生。交易管理一旦檢測到寫入異常,會執行復原操作,即要麼寫入完整的資料,要麼不寫入。在Django中使用事務很簡單:
1.建立項目Transaction,建立應用app01,編輯models建立兩張表並執行資料庫遷移,如下:
from django.db import modelsclass UserInfo(models.Model): username = models.CharField(max_length=32) email = models.EmailField(max_length=64)class Dept(models.Model): title = models.CharField(max_length=32)
2.定義路由:
from django.conf.urls import urlfrom app01 import viewsurlpatterns = [ url(r‘^test/$‘, views.test),]
3.定義test視圖函數;
from django.shortcuts import render, HttpResponsefrom . import modelsdef test(request): try: from django.db import transaction # 匯入事務 with transaction.atomic(): user_obj = models.UserInfo.objects.create(username=‘Lena‘, email=‘[email protected]‘) dept_obj = models.Dept.objects.create(title=‘IT‘) except Exception as e: return HttpResponse(‘error happened, db rollback‘) return HttpResponse(‘OK‘)
說明:
- 以上將建立
user_obj
和dept_obj
記錄的行為組合成一個不可分割的原子性操作,原子內執行的資料庫操作發生任何異常,都會執行復原操作。
- 事物檢查異常復原,但是不容錯,錯誤還是會拋出,因此這裡用了異常捕捉。
- 正常情況下訪問
http://127.0.0.1:8000/test/
,將會得到OK響應,如果我們手動將dept_obj = models.Dept.objects.create(title=‘IT‘)
的title=‘IT‘
改為name=‘IT‘
,手動造成異常,那麼會觸發事物復原,寫入的user_obj
也會撤銷。這一點可以查看資料庫驗證。
注意:事務需要資料庫引擎支援,比如Innodb引擎就是支援的。
Django資料庫補充之事務