什么是臟讀、幻讀、不可重復讀?

臟讀、幻讀和不可重復讀是數據庫事務隔離級別中常見的三種數據一致性問題。它們描述了在并發事務環境下可能出現的異常現象。下面通過對比表格和具體示例進行清晰解析:


核心概念對比表

問題類型觸發場景本質原因示例
臟讀 (Dirty Read)事務A讀取了事務B未提交的修改讀取到其他事務的中間狀態(可能被回滾的數據)事務B修改數據未提交 → 事務A讀取 → 事務B回滾 → 事務A讀到"臟數據"
不可重復讀 (Non-Repeatable Read)同一事務內多次讀取同一數據,結果不一致其他事務修改或刪除了該數據事務A第一次讀取 → 事務B修改數據并提交 → 事務A再次讀取 → 兩次結果不同
幻讀 (Phantom Read)同一事務內多次范圍查詢,結果集數量變化其他事務新增或刪除了范圍內的數據事務A查詢年齡>30有5人 → 事務B新增1個>30記錄 → 事務A再查變6人

詳細解析與示例

一、臟讀(Dirty Read)
  • 定義:事務A讀取了事務B尚未提交的修改,若事務B最終回滾,則事務A讀取的是無效的"臟數據"。
  • 示例
    -- 事務B(未提交)
    UPDATE accounts SET balance = 1000 WHERE id = 1;  -- 原值500-- 事務A(讀取未提交數據)
    SELECT balance FROM accounts WHERE id = 1; -- 讀到1000(臟數據!)-- 事務B回滾
    ROLLBACK;  -- balance恢復為500
    

    📌 風險:事務A基于錯誤數據(1000)進行了錯誤操作。

二、不可重復讀(Non-Repeatable Read)
  • 定義:同一事務內多次讀取同一數據,由于其他事務的修改或刪除操作,導致讀取結果不一致。
  • 示例
    -- 事務A
    SELECT balance FROM accounts WHERE id = 1; -- 第一次讀:500-- 事務B提交修改
    UPDATE accounts SET balance = 800 WHERE id = 1;
    COMMIT;-- 事務A再次讀取
    SELECT balance FROM accounts WHERE id = 1; -- 第二次讀:800(結果改變!)
    

    📌 影響:事務A無法保證多次讀取的一致性(如校驗數據時結果突變)。

三、幻讀(Phantom Read)
  • 定義:同一事務內多次執行范圍查詢,由于其他事務新增或刪除數據,導致結果集數量變化(如"憑空出現"新記錄)。
  • 示例
    -- 事務A:查詢年齡>30的員工
    SELECT * FROM employees WHERE age > 30; -- 返回5條記錄-- 事務B新增并提交
    INSERT INTO employees (name, age) VALUES ('Bob', 35);
    COMMIT;-- 事務A再次查詢
    SELECT * FROM employees WHERE age > 30; -- 返回6條記錄(多出Bob!)
    

    📌 關鍵區別:幻讀關注結果集數量變化(增刪導致),不可重復讀關注單條數據的值變化


隔離級別如何解決這些問題?

數據庫通過四種隔離級別控制并發問題:

隔離級別臟讀不可重復讀幻讀性能
READ UNCOMMITTED (讀未提交)???最高
READ COMMITTED (讀已提交)???
REPEATABLE READ (可重復讀)???*中等
SERIALIZABLE (串行化)???最低

💡 說明:

  • ? = 可避免該問題
  • ? = 無法避免
  • ?* = MySQL的InnoDB引擎通過 MVCC(多版本并發控制) 解決了幻讀,但部分數據庫(如SQL Server)仍需串行化才能避免。

技術原理剖析

  1. 讀已提交(READ COMMITTED)

    • 通過 語句級快照:每次查詢只讀取已提交的數據。
    • 解決臟讀,但無法避免不可重復讀和幻讀。
  2. 可重復讀(REPEATABLE READ)

    • 通過 事務級快照(MVCC):事務首次查詢建立數據快照,后續讀取均基于此版本。
    • 解決臟讀和不可重復讀。
    • MySQL如何解決幻讀
      • 使用 Next-Key Locking(間隙鎖+記錄鎖)鎖定查詢范圍,阻止其他事務插入(能解決大部分的幻讀問題,但是并不能完全解決幻讀)。
  3. 串行化(SERIALIZABLE)

    • 通過 完全加鎖:所有操作串行執行,犧牲并發性換取一致性。
    • 解決臟讀、不可重復讀和幻讀。

實際開發建議

在這里插入圖片描述

  • 優先選擇 READ COMMITTED:平衡性能與一致性(多數場景適用)。
  • 關鍵業務用 REPEATABLE READ:如賬戶余額計算。
  • 極少用 SERIALIZABLE:除非絕對要求數據完美一致(如銀行清算系統)。

?? 注意:不同數據庫實現有差異(如Oracle默認READ COMMITTED,MySQL默認REPEATABLE READ)。

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

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

相關文章

騰訊位置商業授權微信小程序關鍵詞輸入提示

微信小程序JavaScript SDK 開發指南 關鍵詞輸入提示 getSuggestion(options:Object) 用于獲取輸入關鍵字的補完與提示,幫助用戶快速輸入 注:坐標系采用gcj02坐標系 options屬性說明 屬性類型必填說明keywordString是用戶輸入的關鍵詞(希望…

LabVIEW菜單操控

該程序圍繞運行時菜單欄操作,實現從初始化構建菜單結構(含菜單項、快捷鍵 ),到響應交互刪除特定菜單項,再到監控界面事件驅動邏輯,完成自定義菜單交互全流程,適配需靈活菜單控制的程序開發場景。…

Web 服務詳解:HTTP 與 HTTPS 配置

Web 服務詳解:HTTP 與 HTTPS 配置 一、HTTP 服務概述 HTTP(Hypertext Transfer Protocol,超文本傳輸協議)是用于在網絡上傳輸網頁數據的基礎協議,默認使用80 端口,以明文形式傳輸數據。常見的 HTTP 服務軟…

YOLO-v2-tiny 20種物體檢測模型

一、簡介 YOLO-v2-tiny是基于YOLO(You Only Look Once)實時目標檢測算法的輕量級版本,專門為嵌入式設備和資源受限環境優化。本模型能夠檢測20種常見物體類別,在保持較高檢測精度的同時大幅減少了計算量和模型大小。 20種物體檢測模型, 使用…

heterophilic graph和hetergeneous graph區別(附帶homophilic graph 和homoegeneous graph)

Heterophilic Graph(異配圖)連接的節點在屬性上不相似,但是所有節點和邊的類別都是同一種類型,數據集如squirrel / chameleon,它們是 heterogeneous graph(異質圖)而不是Heterophilic Graph(異配…

Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞檢測,命令執行,Getshell

工具介紹 Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞檢測,命令執行,Getshell。JAVAFX可視化編寫,博主第一次用javafx來寫界面,第一次學習嘗試,僅僅只用于學習嘗試如果缺少什么payload,歡迎提交…

GitHub分支保護介紹(Branch Protection)(git分支保護)(通過設置規則和權限來限制對特定分支的操作的功能)

文章目錄**1. 核心功能****a. 防止誤操作****b. 強制代碼審查****c. 狀態檢查(Status Checks)****d. 權限控制****2. 如何設置分支保護?**1. **進入倉庫設置**2. **添加分支保護規則**3. **配置保護規則**4. **保存設置****3. 常見應用場景**…

怎么理解On-Premises

On-Premises 指的是—— 軟件、系統、數據中心等部署并運行在企業自己管理的本地硬件或機房里,而不是放在云端或第三方托管環境中。 你可以把它理解成:“服務器在你自己家里(公司機房),而不是寄放在別人家(…

UserController類講解

用戶管理控制器,實現了用戶CRUD操作的RESTful API: 1. 類結構與核心注解 1.1 控制器聲明 RestController RequestMapping("/api/users") public class UserControllerRestController 深度解析: 組合注解:Controller Re…

【劍指offer】搜索算法

目錄 📁 JZ53 數字在升序數組中出現的次數?編輯 📁 JZ4 二維數組中的查找?編輯 📁 JZ11 旋轉數組的最小數字 📁 JZ38 字符串的排列?編輯 📁 JZ53 數字在升序數組中出現的次數 這就是一道簡單的模板題&#xff0…

ETLCloud批流一體化體現在哪

ETLCloud批流一體化體現在哪 企業對數據處理的實時性、高效性和準確性的要求越來越高。批流一體化作為一種先進的數據處理理念,逐漸被企業所采用。 目前許多國產化ETL工具也裝配了十分強大的批流一體化能力,ETLCoud就是一個很好的代表,它能夠…

Mybatis學習之緩存(九)

這里寫目錄標題一、MyBatis的一級緩存1.1、工作原理1.2、一級緩存失效的四種情況1.3、不同的SqlSession對應不同的一級緩存1.4、同一個SqlSession但是查詢條件不同1.5、同一個SqlSession兩次查詢期間執行了任何一次增刪改操作1.6、同一個SqlSession兩次查詢期間手動清空了&…

windows10裝Ubuntu22.04系統(雙系統)

參考鏈接:Windows和Linux雙系統的保姆級安裝教程,新手小白跟著也能裝_windows安裝linux雙系統-CSDN博客 1 前期準備 1.下載Ubuntu22.04.5 的iso鏡像文件:Download Ubuntu Desktop | Ubuntu 2.準備一個U盤(空,已有文…

Pandas數據處理與分析實戰:Pandas數據清洗與處理入門

數據清洗:Pandas數據處理入門 學習目標 本課程將引導學員了解數據清洗的基本概念,掌握使用Pandas庫處理數據集中的缺失值、重復數據和異常值的方法,確保數據的質量,為后續的數據分析和機器學習任務打下堅實的基礎。 相關知識點 Pa…

Python爬蟲實戰:研究ScrapyRT框架,構建圖書商城數據采集系統

1. 引言 1.1 研究背景 在當今數字化時代,互聯網已成為全球最大的信息庫,蘊含著海量的有價值數據,涵蓋商業、教育、科研、醫療等各個領域。根據 IDC(國際數據公司)預測,到 2025 年全球數據圈將增長至 175ZB,其中網絡數據占比超過 60%。這些數據不僅是企業制定商業策略、…

springboot接口請求參數校驗

參數校驗 參數校驗可以防止無效或錯誤的數據進入系統。通過校驗前端輸入的參數,可以確保數據的完整性,避免因為缺少必要的信息而導致程序錯誤或異常。例如,對于密碼字段,可以通過校驗規則要求用戶輸入至少8個字符、包含字母和數字…

Docker部署 Neo4j 及集成 APOC 插件:安裝與配置完整指南(docker-compose)

Docker部署 Neo4j 及集成 APOC 插件:分步驟指南 摘要 :本文將分兩部分詳細介紹相關內容。第一部分講解如何使用 Docker Compose 部署 Neo4j 圖數據庫,提供完整配置文件及常見問題解決方案;第二部分在前者基礎上,介紹 A…

TLSv1.2協議與TCP/UDP協議傳輸數據內容差異

一、Wireshark中常見的TLSv1.2在用Wireshark抓包時,除了看到課堂上教過的經典的TCP/UDP協議,還有一個協議經常出現——TLSv1.2。并且這個協議的Info解釋是Application data,其實看到這個解釋,我大概猜出來了TLSv1.2是用來給用戶數…

51c自動駕駛~合集14

自己的原文哦~ https://blog.51cto.com/whaosoft/11707335 #Text2LiDAR 文本引導的無條件點云生成新SOTA 論文題目:《Text2LiDAR: Text-guided LiDAR Point Cloud Generation via Equirectangular Transformer》 論文地址:https://arxiv.o…

k8s基本概念

k8s 的基本概念 Kubernetes是一個可以移植、可擴展的開源平臺,使用 聲明式的配置 并依據配置信息自動地執行容器化應用程序的管理。在所有的容器編排工具中(類似的還有 docker swarm / mesos等),Kubernetes的生態系統更大、增長更…