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