日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Django?事務回滾的具體實現_python

作者:Sunny_Boy0518 ? 更新時間: 2023-05-23 編程語言

一、事務的四大特性

一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

  • 原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
  • 一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
  • 隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
  • 持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。

二、數據庫事務

Django中對于數據庫的事務,默認每執行一句數據庫操作,便會自動提交,我們需要在保存訂單中自己控制數據庫事務的執行流程

2.1使用裝飾器(整體回滾,不處理異常)

調用@transaction.atomic,進行整體回滾

from django.db import transaction

@transaction.atomic
def viewfunc(request):
? ? # 這些代碼會在一個事務中執行
? ? #...

2.2使用with語句(部分回滾,不處理異常)

from django.db import transaction

def viewfunc(request):
? ? # 這部分代碼不在事務中,會被Django自動提交
? ? #...

? ? with transaction.atomic():
? ? ? ? # 這部分代碼會在事務中執行
? ? ? ? #...

注:裝飾器和with語句直接使用會導致異常沒有辦法處理,如果需要處理異常,則可以通過以下的方式進行

2.3使用with語句(部分回滾,可以處理異常)

from django.db import transaction

def viewfunc(request):
? ? # 這部分代碼不在事務中,會被Django自動提交
? ? #...
?? ?try:
? ? ? ? with transaction.atomic():
? ? ? ? ? ? # 這部分代碼會在事務中執行
? ? ? ? ? ? #...
? ? except 異常:
? ? ? ? # 處理異常的代碼

2.4使用保存點(部分回滾,可以處理異常)

需要注意的是要和裝飾器進行配合

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)
? ? ? ? # 處理異常的代碼

原文鏈接:https://blog.csdn.net/Sunny_Boy0518/article/details/124432161

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新