1. 程式人生 > >Django資料庫補充之事務

Django資料庫補充之事務

往資料庫寫入資料時,如果寫入了不完整的資料,我們稱之為髒資料。事務管理(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')
  4. 說明:

    1. 以上將建立user_objdept_obj記錄的行為組合成一個不可分割的原子性操作,原子內執行的資料庫操作發生任何異常,都會執行回滾操作。
    2. 事物檢查異常回滾,但是不容錯,錯誤還是會丟擲,因此這裡用了異常捕捉。
    3. 正常情況下訪問http://127.0.0.1:8000/test/,將會得到OK響應,如果我們手動將dept_obj = models.Dept.objects.create(title='IT')title='IT'改為name='IT',手動造成異常,那麼會觸發事物回滾,寫入的user_obj也會撤銷。這一點可以檢視資料庫驗證。


注意一點:事務需要資料庫引擎支援,比如Innodb引擎就是支援的。