您好,登錄后才能下訂單哦!
這篇文章主要介紹“Django事務回滾如何實現”,在日常操作中,相信很多人在Django事務回滾如何實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Django事務回滾如何實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
Django中對于數據庫的事務,默認每執行一句數據庫操作,便會自動提交,我們需要在保存訂單中自己控制數據庫事務的執行流程
調用@transaction.atomic,進行整體回滾
from django.db import transaction @transaction.atomic def viewfunc(request): # 這些代碼會在一個事務中執行 #...
from django.db import transaction def viewfunc(request): # 這部分代碼不在事務中,會被Django自動提交 #... with transaction.atomic(): # 這部分代碼會在事務中執行 #...
注:裝飾器和with語句直接使用會導致異常沒有辦法處理,如果需要處理異常,則可以通過以下的方式進行
from django.db import transaction def viewfunc(request): # 這部分代碼不在事務中,會被Django自動提交 #... try: with transaction.atomic(): # 這部分代碼會在事務中執行 #... except 異常: # 處理異常的代碼
需要注意的是要和裝飾器進行配合
from django.db import transaction @transaction.atomic def viewfunc(request): # 這部分代碼不在事務中,會被Django自動提交 #... try: # 在事務開始前創建保存點 save_id = transaction.savepoint() # 這部分代碼會在事務中執行 #... # 提交從保存點到當前狀態的所有數據庫事務操作 transaction.savepoint_commit(save_id) except 異常: # 回滾到保存點 transaction.savepoint_rollback(save_id) # 處理異常的代碼
到此,關于“Django事務回滾如何實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。