django數據庫事務

數據庫原子操做

舉個例子:python

一個消費者在一個商戶裏刷信用卡消費,交易正常時,銀行在消費者的帳戶裏減去相應的款項,在商戶的賬戶加上相應的款項。可是若是銀行從消費者的帳戶里扣完錢以後,還未在商戶的賬戶里加上相應的款項時,因爲某些緣由,系統或者數據庫出現異常了,那麼此時錢已經從消費者的帳戶里扣除了,可是商戶的帳戶裏卻沒有加上相應的款項,這種狀況下,最好的解決辦法就是使用數據庫的原子性操做,也就是數據庫的事務。保證要麼同時成功,要麼同時失敗,而後才向數據庫commit。sql

Django默認向數據庫的提交方式

Django的默認行爲是在自動提交模式下運行。除非事務處於活動狀態,不然每一個查詢都會當即提交到數據庫。
數據庫

Django自動使用事務或保存點來保證須要多個查詢的ORM操做的完整性,尤爲是delete()和update()查詢。django

事務提交後執行任務

有時您須要執行與當前數據庫事務相關的操做,但前提是事務成功提交。示例可能包括celery任務,電子郵件通知或緩存失效緩存

Django提供了on_commit()註冊回調函數的函數,這些函數應在成功提交事務後執行函數

from django.db import transaction

def do_something():
    pass  # send a mail, invalidate a cache, fire off a Celery task, etc.

transaction.on_commit(do_something)

  

django如何實現事務

from django.db import transaction

def create(request):
    try:
        with transaction.atomic():
            models.Userinfo.objects.create(username="stu01", email="stu01@qq.com")
            models.Group.objects.create(title="python")

    except Exception as e:
        return HttpResponse("出現錯誤....")
    return HttpResponse("ok")

  

這樣兩條sql語句同時插入成功或失敗atom

相關文章
相關標籤/搜索