1. 程式人生 > >Django數據庫補充之事務

Django數據庫補充之事務

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)

  說明:

  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引擎就是支持的。

Django數據庫補充之事務