最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django MySQL 事務(wù)機制與回滾行為的使用說明

 更新時間:2025年12月24日 10:07:17   作者:言之。  
transaction.atomic()是Django中管理數(shù)據(jù)庫事務(wù)的關(guān)鍵工具,下面就來詳細的介紹一下transaction.atomic()的使用,感興趣的可以了解一下

Django 中 transaction.atomic() 的事務(wù)行為進行系統(tǒng)性總結(jié),重點說明:哪些異常會觸發(fā)自動回滾、哪些情況不會、為何產(chǎn)生差異,以及如何正確編寫可控的事務(wù)邏輯。

1. transaction.atomic() 的基本行為

transaction.atomic() 會在進入時創(chuàng)建一個 數(shù)據(jù)庫保存點(savepoint)。
代碼塊退出時根據(jù)執(zhí)行結(jié)果決定回滾或提交:

  • 若出現(xiàn) 未捕獲的異常:自動回滾到保存點,并繼續(xù)拋出該異常。
  • 若代碼執(zhí)行正常結(jié)束:提交保存點。

核心原則:是否回滾取決于是否有異常向外拋出。

2. 會觸發(fā)自動回滾的情況

2.1 未捕獲的 Python 異常

只要異常沒有在 atomic 塊內(nèi)被捕獲,都會觸發(fā)回滾,包括:

  • ZeroDivisionError
  • ValueError
  • TypeError
  • KeyError
  • IndexError
  • AssertionError
  • 自定義異常
  • raise Exception("...")

示例:

with transaction.atomic():
    obj = Model.objects.create(...)
    raise Exception("abort transaction")  # 未捕獲 → 自動回滾

2.2 未捕獲的 Django ORM / 數(shù)據(jù)庫異常

數(shù)據(jù)庫相關(guān)異常未被捕獲時,也會觸發(fā)自動回滾,包括:

  • IntegrityError(唯一約束、外鍵約束)
  • DataError(無效數(shù)據(jù))
  • OperationalError(死鎖、鎖超時)
  • ProgrammingError(SQL 錯誤)
  • DatabaseError
  • InterfaceError

示例:

with transaction.atomic():
    Model.objects.create(id=1)
    Model.objects.create(id=1)  # IntegrityError → 自動回滾

2.3 DRF 驗證錯誤(raise_exception=True)

serializer.is_valid(raise_exception=True)

該語句拋出的 ValidationError 未被捕獲 → 自動回滾。

3. 不會自動回滾的情況

3.1 異常被捕獲并吞掉

只要異常被捕獲,沒有繼續(xù)向外拋出,Django 會視為“執(zhí)行成功”,不會回滾。

with transaction.atomic():
    try:
        raise Exception("error")
    except Exception:
        pass  # 異常被吞掉 → 不回滾

若需要強制回滾,必須手動調(diào)用:

transaction.set_rollback(True)

3.2 沒有異常但提前 return

業(yè)務(wù)判斷不屬于錯誤,不會自動回滾。

with transaction.atomic():
    if invalid:
        return Response({"error": ...})  # 不回滾

3.3 DRF 驗證錯誤未 raise

serializer.is_valid(raise_exception=False)
if serializer.errors:
    return Response(serializer.errors)  # 不回滾

只有拋出異常才會回滾。

3.4 數(shù)據(jù)庫層無異常但邏輯錯誤

例如外鍵檢查關(guān)閉、不符合約束但 MySQL 未拋錯,此類不會產(chǎn)生自動回滾。

3.5 使用 atomic(savepoint=False) 并在內(nèi)部捕獲異常

with transaction.atomic(savepoint=False):
    try:
        raise Exception()
    except:
        pass

內(nèi)部異常被捕獲 → 無異常向上拋出 → 不會回滾。

4. raise Exception(‘xxx’) 是否回滾?

答案:會回滾,只要未被捕獲。

raise Exception('xxx') 會觸發(fā) Python 異常,atomic 在退出時檢測到異常 → 自動回滾保存點。

示例:

with transaction.atomic():
    raise Exception("abort")  # 自動回滾

若被捕獲,則不會回滾:

with transaction.atomic():
    try:
        raise Exception("abort")
    except Exception:
        pass  # 無異常向上拋出 → 不回滾

5. 總結(jié):事務(wù)回滾的唯一決定因素

Django 中事務(wù)是否回滾,唯一決定因素:

是否有異常從 atomic 塊中冒出。

可以總結(jié)為:

  • 未捕獲異常 → 自動回滾
  • 捕獲異常 → 不自動回滾
  • 沒有異常 → 正常提交
  • DRF raise_exception=True → 會回滾
  • return 并非錯誤 → 不回滾

6. 推薦的事務(wù)編寫模式(最佳實踐)

from django.db import transaction

def perform_action():
    try:
        with transaction.atomic():
            # 業(yè)務(wù)邏輯
            do_something()

    except Exception as e:
        # atomic 已自動回滾
        handle_error(e)
        raise

如果希望在捕獲異常后仍然回滾:

with transaction.atomic():
    try:
        do_something()
    except Exception:
        transaction.set_rollback(True)  # 手動回滾
        raise

到此這篇關(guān)于Django MySQL 事務(wù)機制與回滾行為的使用說明的文章就介紹到這了,更多相關(guān)Django MySQL 事務(wù)機制與回滾行為內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python去除字符串前后空格的三種方法匯總

    Python去除字符串前后空格的三種方法匯總

    這篇文章主要給大家介紹了關(guān)于Python去除字符串前后空格的三種方法,需要的朋友可以參考下
    2023-01-01
  • Python PyAutoGUI超詳細實戰(zhàn)教程 附完整教學(xué)代碼

    Python PyAutoGUI超詳細實戰(zhàn)教程 附完整教學(xué)代碼

    本文將從環(huán)境搭建、基礎(chǔ)配置、鼠標(biāo)自動化、鍵盤自動化、屏幕操作、高級功能、實戰(zhàn)案例七個維度展開,搭配可直接運行的教學(xué)代碼,覆蓋新手入門到實戰(zhàn)應(yīng)用的全部核心知識點,對Python PyAutoGUI 相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Python數(shù)據(jù)分析之獲取雙色球歷史信息的方法示例

    Python數(shù)據(jù)分析之獲取雙色球歷史信息的方法示例

    這篇文章主要介紹了Python數(shù)據(jù)分析之獲取雙色球歷史信息的方法,涉及Python網(wǎng)頁抓取、正則匹配、文件讀寫及數(shù)值運算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • 解決python logging遇到的坑 日志重復(fù)打印問題

    解決python logging遇到的坑 日志重復(fù)打印問題

    這篇文章主要介紹了解決python logging遇到的坑 日志重復(fù)打印問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 一文詳解Python中pip安裝路徑的查看與修改指南

    一文詳解Python中pip安裝路徑的查看與修改指南

    在日常Python開發(fā)中,我們經(jīng)常使用pip安裝各種第三方庫,但你是否曾好奇這些包到底安裝到了電腦的哪個位置,下面小編就和大家詳細講講如何查看和修改pip的默認安裝路徑吧
    2026-03-03
  • 探索Python函數(shù)調(diào)用為何加速代碼執(zhí)行原理

    探索Python函數(shù)調(diào)用為何加速代碼執(zhí)行原理

    Python 作為一種解釋型語言,其執(zhí)行速度相對于編譯型語言可能會較慢,然而,在Python中,通常觀察到代碼在函數(shù)中運行得更快的現(xiàn)象,這個現(xiàn)象主要是由于函數(shù)調(diào)用的內(nèi)部優(yōu)化和解釋器的工作方式導(dǎo)致的,本文將深入探討這個現(xiàn)象,并通過詳細的示例代碼進行解釋
    2024-01-01
  • 非遞歸的輸出1-N的全排列實例(推薦)

    非遞歸的輸出1-N的全排列實例(推薦)

    下面小編就為大家?guī)硪黄沁f歸的輸出1-N的全排列實例(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Python發(fā)起請求提示UnicodeEncodeError錯誤代碼解決方法

    Python發(fā)起請求提示UnicodeEncodeError錯誤代碼解決方法

    這篇文章主要介紹了Python發(fā)起請求提示UnicodeEncodeError錯誤代碼解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 使用Matplotlib繪制不同顏色的帶箭頭的線實例

    使用Matplotlib繪制不同顏色的帶箭頭的線實例

    這篇文章主要介紹了使用Matplotlib繪制不同顏色的帶箭頭的線實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python-django中的APPEND_SLASH實現(xiàn)方法

    python-django中的APPEND_SLASH實現(xiàn)方法

    這篇文章主要介紹了python-django中的APPEND_SLASH實現(xiàn)方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06

最新評論

武强县| 肃南| 磴口县| 黄梅县| 湖南省| 丹棱县| 渑池县| 开江县| 松阳县| 房山区| 开平市| 蒙阴县| 安平县| 乌拉特后旗| 丹阳市| 田阳县| 南和县| 定远县| 灵丘县| 射阳县| 信宜市| 鄢陵县| 都兰县| 禄劝| 杂多县| 文安县| 沈丘县| 龙游县| 古丈县| 石狮市| 冷水江市| 正阳县| 衡东县| 宁化县| 通山县| 藁城市| 牡丹江市| 离岛区| 宽城| 呼伦贝尔市| 奉节县|