Django `transaction.atomic()` 完整使用指南

目錄

  1. #概述
  2. #基本用法
  3. #事務一致性保障機制
  4. #破壞一致性的常見場景
  5. #高級用法
  6. #最佳實踐
  7. #診斷與調試
  8. #附錄

概述

transaction.atomic() 是 Django 提供的數據庫事務管理工具,用于確保一系列數據庫操作要么全部成功提交,要么全部回滾,維護數據的一致性。

基本用法

1. 作為上下文管理器

from django.db import transactiondef view_func(request):with transaction.atomic():# 事務內的操作obj1.save()obj2.save()

2. 作為裝飾器

@transaction.atomic
def view_func(request):# 整個函數都在事務中執行obj1.save()obj2.save()

事務一致性保障機制

  • 進入塊時:創建保存點或開始新事務
  • 成功退出:提交所有更改
  • 異常退出:自動回滾所有更改
  • 嵌套處理:內層塊作為保存點處理

破壞一致性的常見場景

1. 異常處理不當

with transaction.atomic():try:risky_operation()except Exception:logger.error("Error occurred")  # 不重新拋出異常 → 破壞一致性

修復方案

with transaction.atomic():try:risky_operation()except Exception as e:logger.error("Error occurred")raise  # 重新拋出異常

2. 長時間運行事務

with transaction.atomic():process_data()  # 耗時操作update_database()  # 可能因鎖超時失敗

3. 混合非數據庫操作

with transaction.atomic():save_to_db()call_external_api()  # 網絡操作save_to_db_again()   # 外部API失敗可能導致不一致

4. 多數據庫操作

with transaction.atomic():  # 只針對default數據庫ModelA.objects.create(...)  # defaultModelB.objects.using('other_db').create(...)  # 不受保護

5. 隔離級別沖突

# 事務1
with transaction.atomic():item = Item.objects.select_for_update().get(pk=1)time.sleep(10)# 事務2 (并發執行)
with transaction.atomic():item = Item.objects.get(pk=1)  # 可能被阻塞或讀取過期數據

高級用法

1. 手動保存點控制

with transaction.atomic():a.save()sid = transaction.savepoint()  # 創建保存點try:b.save()except Exception:transaction.savepoint_rollback(sid)  # 回滾到保存點# 可繼續其他操作transaction.savepoint_commit(sid)  # 釋放保存點

2. 指定數據庫

with transaction.atomic(using='replica_db'):ReplicaModel.objects.create(...)

3. 嵌套事務控制

with transaction.atomic():  # 外層事務a.save()try:with transaction.atomic():  # 內層保存點b.save()raise ValueErrorexcept ValueError:pass  # 僅回滾內層c.save()  # 仍會提交

最佳實踐

  1. 保持事務簡短:只包含必要的數據庫操作
  2. 明確異常處理
    • 要么完全處理并確保一致性
    • 要么重新拋出異常
  3. 避免混合操作
    • 不在事務中執行網絡/文件IO
    • 不在事務中執行耗時計算
  4. 多數據庫處理
    with transaction.atomic(using='default'):with transaction.atomic(using='other_db'):# 跨數據庫操作
    
  5. 測試隔離級別:了解數據庫的默認隔離級別
  6. 監控長事務:設置數據庫長事務警報

診斷與調試

1. 檢查事務狀態

from django.db import connectionprint(f"In atomic block: {connection.in_atomic_block}")
print(f"Needs rollback: {connection.needs_rollback}")

2. 檢查隔離級別(PostgreSQL)

with connection.cursor() as cursor:cursor.execute("SHOW transaction_isolation")print(cursor.fetchone())

3. 日志記錄

LOGGING = {'loggers': {'django.db.backends': {'level': 'DEBUG','handlers': ['console'],}}
}

附錄

支持的數據庫后端

數據庫支持級別注意事項
PostgreSQL完全支持建議使用
MySQL/MariaDB支持需使用InnoDB
SQLite支持實際是文件鎖
Oracle完全支持-
SQL Server支持需驗證隔離級別

事務隔離級別參考

級別臟讀不可重復讀幻讀說明
讀未提交可能可能可能最低隔離
讀已提交不可能可能可能多數數據庫默認
可重復讀不可能不可能可能MySQL默認
串行化不可能不可能不可能最高隔離

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89545.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UDP協議的端口161怎么檢測連通性

UDP 端口 161 (SNMP) 連通性檢測的專業指南 UDP 161 端口是 SNMP (Simple Network Management Protocol) 服務的標準端口。由于其無連接特性,檢測需要特殊方法。以下是全面的檢測方案: 一、專業檢測方法 1. 使用 SNMP 專用工具(推薦&#xff…

進階數據結構:紅黑樹

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

如何上傳github(解決git的時候輸入正確的賬號密碼,但提示認證失敗)

如何上傳github文件,刪除文件 1.重點 GitHub 從 2021 年 8 月 13 日起移除了對密碼認證的支持。你需要使用個人訪問令牌(Personal Access Token, PAT)或 SSH 密鑰來進行認證。 2.生成SSH key 進入設置點擊New SSH Key名字隨便取,可以自己方便記3.上傳文件…

多級緩存架構與熱點探測系統核心技術解析

多級緩存架構與熱點探測系統核心技術解析 📌 一、多級緩存架構 1. 為什么需要多級緩存? ? 本地緩存優勢: 🚀 減少網絡請求,提升訪問性能🌐 分布式系統中天然具有分布式緩存特性?? 有效降低遠程緩存&…

iOS 性能監控工具全解析 選擇合適的調試方案提升 App 性能

在iOS應用開發中,性能往往是決定用戶體驗的關鍵因素之一。用戶體驗的優劣,不僅取決于功能的實現,還在于流暢度、響應速度、資源消耗等方面的表現。因此,性能監控工具在iOS開發中的重要性不可小覷。 無論是提升應用的啟動時間、減少…

C++ :vector的介紹和使用

vector學習時一定要學會查看reference 目錄 前言 一、vector基本概念 1.1vector是什么? 1.2內存管理 二、vector的使用 2.1vector的構造 2.2vector iterator 的使用 2.3vector 空間增長問題 2.4vector的元素訪問 2.5vector 增刪查改 總結 前言 在C編程中&#x…

iOS OC 圖片壓縮

純代碼,不廢話,歡迎copy使用,記得點贊 +(NSData *)imageData:(UIImage *)image maxSize:(int)maxSize{ // 設置最大文件大小(200KB) NSLog(@"執行壓縮方案 期望壓縮目標%dk",maxSize); return [self compressImage:image toMaxSize:maxSize]; } // 主壓縮方…

如何更改 SQLserver 數據庫存儲的位置 想從C盤換到D盤

在 SQL Server 中更改數據庫存儲位置(從 C 盤遷移到 D 盤)需要通過以下步驟完成:1. 確定數據庫文件的當前位置首先查詢數據庫文件的當前路徑:sqlSELECT name, physical_name AS current_location FROM sys.master_files WHERE dat…

【unitrix】 6.8 加一運算(add_one.rs)

一、源碼 這是一個使用 Rust 類型系統實現二進制數加一操作的代碼。 use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 類型級加一操作 trait /// /// 為二進制數類型實現加一操作,返回新的類型 pub trait AddOne {/// 加一操作的結果類型type Output;//…

國內Ubuntu訪問不了github、 huggingface等

各位小伙伴們,大家好呀。 大家是不是經常遇到訪問不了github、huggingface的情況呀。 在Ubuntu中可以這樣做。 訪問這個網站網站測速-Ping檢測-Trace查詢-Dig查詢-路由跟蹤查詢-tools.ipip.net, 對于github.com,在這個網站輸入github.com…

「Java EE開發指南」如何用MyEclipse創建企業應用項目?(一)

由于有了項目模型和管理工具,現在可以創建Java EE企業應用程序。在本文中您將了解到: 企業應用項目模型項目組織、依賴關系和類解析 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 1. 企業應用項目模型 MyEclipse提供了一個企業應用程序項…

ubuntu 22.04 pam 模塊設置用戶登錄失敗鎖定

1、ubuntu 22.04 配置方法 /etc/pam.d/common-auth 加到如下行后 # auth [success1 defaultignore] pam_unix.so nullok # 添加如下內容 auth [defaultdie] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc/etc/pam.d/common…

Linux 定時任務全解析:atd 與 crond 的區別及實戰案例(含日志備份 + 時間寫入)

1. atd 和 crond 兩個任務管理程序的區別atd:用于執行一次性的定時任務,即設置任務在某個特定的時間點僅執行一次 ,適合處理不需要重復執行的定時操作,比如在未來某個確切時間執行一個腳本、發送一份文件等場景。crond&#xff1a…

iOS加固工具有哪些?項目場景下的組合策略與實戰指南

在如今的iOS項目中,“加固”不僅是單一手段,更是多工具協同應用的過程。不同項目場景對安全要求的側重點不同,需要針對性地組合加固工具,才能最大化兼顧安全性、兼容性與效率。 本文將從常見項目場景出發,分析當下市面…

Xilinx Zynq:一款適用于軟件定義無線電的現代片上系統

摘要——軟件定義無線電可以在通用處理器 (CPU) 上實現,例如基于 PC 的處理器。處理器具有高度靈活性:它不僅可以用來處理數據樣本,還可以控制接收器功能、顯示瀑布圖或運行解調軟件。然而,由于處理速度相對較慢,處理器…

接口黑洞?破!安全堡壘?筑!冰火煉獄?戰!MES7114W終極掌控

在工業4.0加速推進的時代,設備互聯正面臨三大關鍵挑戰:多協議接口的“通信割裂”、極端環境的嚴苛考驗,以及高危場景下的安全紅線。在礦山井下、冶金車間、化工廠區等惡劣環境中,傳統有線方案往往受限于高成本布線、維護困難和環境…

深入理解進程地址空間:虛擬內存與進程獨立性

目錄 引言 虛擬地址空間的本質 關鍵觀察 進程地址空間布局 虛擬內存管理:mm_struct 虛擬內存的優勢 總結 引言 在操作系統中,每個進程都運行在自己的獨立區域中,這個區域就是??進程地址空間??。今天我們就來探討這個看似真實實則虛…

Apache ActiveMQ 任意文件寫入漏洞(CVE-2016-3088)復現利用

漏洞原理 Apache ActiveMQ是Apache軟件基金會所研發的開放源代碼消息中間件,由于ActiveMQ是一個純Java程序,因此只需要操作系統支持Java虛擬機,ActiveMQ便可執行 本漏洞出現在fileserver應用中,漏洞原理其實非常簡單&#xff0c…

谷歌地球與ArcGIS Pro查看三維地形

(1)Google Earth Web端 通過網站:https://earth.google.com/,進入谷歌地球Web端,可以查看歷史影像、三維地形數據、導入kml文件等。 (2)ArcGIS Pro查看三維場景 加載3D地形數據,轉…

Day06_C語言網絡編程20250718

01.思維導圖1 什么是 modbus他是一個在工控領域非常好用的通信寫 modbus協議本質上是一個 基于 tcp 協議二次封裝的一個協議 什么叫做基于tcp二次封裝的協議:我們自己寫的pack_t(無論靜態還是動態),都是屬于二次封裝的協議modbus協議是一種 “主從問答式…