Django數據庫補充之事務
阿新 • • 發佈:2017-10-19
span transacti 原子 inno 事物 行數 obj except ret
往數據庫寫入數據時,不經意間就會寫入不完整的數據,我們稱之為臟數據。事務管理(transaction)可以防止這種情況發生。事務管理一旦檢測到寫入異常,會執行回滾操作,即要麽寫入完整的數據,要麽不寫入。在Django中使用事務很簡單:
1.新建項目Transaction,創建應用app01,編輯models創建兩張表並執行數據庫遷移,如下:
from django.db import models class 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 url from app01 import views urlpatterns = [ url(r‘^test/$‘, views.test), ]
3.定義test視圖函數;
from django.shortcuts import render, HttpResponse from . import models def 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數據庫補充之事務