Django的ORM實現數據庫事務操作


在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所支持的事務操作.!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM