【MySql】事務的原理

?

【MySql】事務的原理

  • 數據庫的隔離級別原理
    • 讀未提交
    • 讀已提交
    • 可重復讀(Repeatable Read)
    • 串行化(最高的隔離級別,強制事務串行執行,避免了所有并發問題)
    • MVCC(Multi-Version Concurrency Control多版本并發控制)
      • UNDO日志版本鏈(數據庫原子性原理)
        • 介紹
        • UNDO的實現
      • Read View(一致性視圖)
        • ***Read View的執行流程***
        • Read View的可見性規則
  • 數據庫的一致性
  • 持久性
  • 事務的優化

事務:要么全部成功要么全部失敗,目的是為了保證數據最終的一致性。

數據庫的隔離級別原理

在事務并發執行時,他們內部的操作不能互相干擾,隔離 性由MySQL的各種鎖以及MVCC機制來實現

先了解下面三個概念

  1. 臟讀(Dirty Read)
    指一個事務讀取到了另一個未提交事務修改的數據。
  2. 不可重復讀(Non-Repeatable Read)
    指同一個事務內,兩次讀取同一數據時,結果不一致(因為中間被其他已提交事務修改 / 刪除了)。
  3. 幻讀(Phantom Read)
    指同一個事務內,兩次執行相同的查詢語句時,返回的結果集行數不一致(因為中間被其他已提交事務新增 / 刪除了符合條件的記錄)。
  4. 可重復讀
    可重復讀的核心目標是:保證同一事務內,多次讀取同一數據時,結果始終一致,不受其他已提交事務的修改影響,從而避免 “不可重復讀” 問題。
    例子:在這個事務執行的時候,InnoDB 會為該事務創建一個 一致性視圖(Read View),他事務即使修改了數據并提交,只要當前事務沒結束,就看不到這些修改(因為視圖沒變)。
  5. 臟寫(Dirty Write)
    是指一個事務修改了另一個未提交事務已經修改過的數據。
    比如:事務 A 修改數據 X 為 100(未提交);
    事務 B 此時也修改數據 X 為 200(未提交);
    最終無論 A/B 是否提交,A 的修改都會被 B 覆蓋(或反之),導致未提交的中間狀態被直接覆蓋。
    所以不建議在 Java 代碼中先讀取數據、在內存中計算(如做加法),再更新回數據庫。這種方式在并發場景下很容易出現 “更新丟失” 問題,而應該盡量通過數據庫層面的原子操作來實現。
優先用數據庫原子操作(推薦)
示例:給用戶余額加 100// 條件構造器:更新id=1的用戶,balance = balance + 100
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 1).setSql("balance = balance + 100"); // 直接在數據庫層面計算// 執行更新(底層生成 SQL:UPDATE user SET balance = balance + 100 WHERE id = 1)
userMapper.update(null, updateWrapper);

讀未提交

讀未提交(Read Uncommitted)
最低的隔離級別,允許一個事務讀取另一個未提交事務的數據
可能出現的問題:臟讀、不可重復讀、幻讀
適用場景:對數據一致性要求極低,追求最高并發性能的場景

SET transaction_isolation = 'READ-UNCOMMITTED';
BEGIN;
select * from app_userw where id = 1;

使用讀未提交事務進行修改

SET transaction_isolation = 'READ-UNCOMMITTED';-- 開啟事務
BEGIN;-- 執行更新操作
UPDATE app_userw 
SET  age = 30 
WHERE id = 1;

我并沒有提交更新但是讀到的age已經被修改成了30這就是讀未提交(READ UNCOMMITTED)
在這里插入圖片描述
在這種情況下如果使用代碼去讀就會”臟讀“。

讀已提交

讀已提交(Read Committed)
跟上面不一樣的點則是如果未提交則不能被讀
保證一個事務只能讀取另一個已提交事務的數據
解決了臟讀問題,但仍可能出現不可重復讀和幻讀
適用場景:大多數關系型數據庫的默認隔離級別(如 SQL Server、Oracle),適用于對數據一致性有一定要求的場景

可重復讀(Repeatable Read)

確保同一事務中多次讀取同一數據的結果一致
解決了臟讀和不可重復讀問題,但仍可能出現幻讀
適用場景:MySQL 的默認隔離級別,適用于需要保證數據可重復讀取的場景
串行化(Serializable)
實現原理:
第一次查的時候都是查視圖,除非使用了update等操作才會進行數據的更新,但是也僅限于更新的那條數據而已,其他的數據還是視圖的數據。

串行化(最高的隔離級別,強制事務串行執行,避免了所有并發問題)

解決了臟讀、不可重復讀和幻讀所有問題
適用場景:對數據一致性要求極高,但可以接受極低并發性能的場景

對事務操作的數據加鎖(如表鎖、行鎖、范圍鎖),阻止其他事務同時修改或讀取。例如,事務 A 操作某行數據時,其他事務必須等待 A 完成后才能操作。

MVCC(Multi-Version Concurrency Control多版本并發控制)

MVCC 通過 “版本鏈存儲歷史數據 + Read View 判斷可見性” 的機制,巧妙地讓讀寫操作并行執行,同時通過事務 ID 和可見性規則保證隔離性。

數據庫事務是通過MVCC機制來實現的,其核心思想是通過UNDO保存數據的多個歷史版本,讓讀寫操作在不阻塞彼此的情況下并行執行,同時保證事務隔離性。

InnoDB 會為每個數據行自動添加三個隱藏列,用于版本管理:
DB_TRX_ID:記錄最后一次修改該行數據的事務 ID(6 字節)。
DB_ROLL_PTR:回滾指針(7 字節),指向該行的上一個歷史版本(存儲在 undo 日志中)。
DB_ROW_ID:若表沒有主鍵,InnoDB 會自動生成該列作為隱含主鍵(6 字節)。

UNDO日志版本鏈(數據庫原子性原理)

介紹

UNDO 日志作為版本鏈的載體,不僅支撐了 MVCC,還為事務回滾提供了基礎,是數據庫高并發能力的核心技術之一。 記錄事務對數據的修改操作(如插入、更新、刪除)的反向操作,用于在事務回滾或需要讀取歷史版本時恢復數據。

若事務執行失敗(如代碼異常、數據庫崩潰),數據庫會通過 undo 日志反向執行所有操作,將數據恢復到事務開始前的狀態,保證 “全不做”。
1.事務提交機制
事務只有在顯式執行COMMIT時,所有修改才會被確認(持久化到磁盤);若執行ROLLBACK或異常終止,數據庫直接根據 undo 日志回滾,確保 “全不做”。
2.崩潰恢復
數據庫崩潰后重啟時,會通過事務日志(如 InnoDB 的 redo log 和 undo log) 檢查未完成的事務:對已提交的事務,確保修改生效;對未提交的事務,通過 undo 日志回滾,避免殘留中間狀態。

UNDO的實現

trx_id是事務的唯一id,roll_poiner是回滾指針,指向前一條數據,如果出現了問題就會通過這個回滾指針回滾到上一個版本,每個事務都是單獨的,第一條事務的id就是他自己。
注意(begin/start transaction 命令并不是一個事務的起點,在執行到它們之后第一條執行的修改操作的InnoDB語句事務才真正的啟動,才會像數據庫申請事務id(trx_id),mysql內部是嚴格按照事務的啟動順序來分配id。)

每一次的修改就是把上一個的事務的事務id寫到roll_poiner中并且在新增一個新的trx_id,不管事務有沒有執行commit他都會存儲在這個版本鏈里面
在這里插入圖片描述

這種機制既保證了事務的原子性(要么全做,要么全不做),又為多版本并發控制提供了基礎。

Read View(一致性視圖)

Read View 是 MVCC 中判斷數據版本可見性的依據。
他有4 個參數:

m_ids:當前未提交的活躍事務 ID 數組
min_trx_id:活躍事務中最小的 ID
max_trx_id:下一個要分配的事務 ID(未開始的事務)這是一個全局遞增的計數器,用于為新事務分配唯一 ID。
creator_trx_id:當前事務自己的 ID

組成規則:
這個視圖包含查詢時所有未提交事務的 ID 數組,以及該數組中的最小事務 ID、已創建的最大事務 ID,同時還包括生成此視圖的當前事務自身 ID,共同作為判斷數據版本可見性的依據。

Read View的執行流程

在這里插入圖片描述
圖里事務 300 提交后執行查詢,此時生成 Read View 時,會記錄當前數據庫里的活躍事務(也就是未提交的事務,比如圖里的 100、200 ,因為 300 自己提交了,不算活躍了),用來決定查詢能看到哪些版本的數據。
注意:
只要事務第一次需要讀數據 ,InnoDB 就會給這個事務生成一個 Read View 。一旦生成,在可重復讀(Repeatable Read)隔離級別 下,這個 Read View 會跟著事務走到底。

Read View的可見性規則

在可重復讀隔離級別,當事務開啟,執行任何查詢sql時會生成當前事務的一致性視圖read-view,該視圖在事務結束之前都不會變化(如果是讀已提交隔離級別在每次執行查詢sql時都會重新生成),這個視圖由執行查詢時所有未提交事務id數組(數組里最小的id為min_id)和已創建的最大事務id(max_id)組成,事務里的任何sql查詢結果需要從對應版本鏈(undo回滾日志)里的最新數據開始逐條跟read-view做比對從而得到最終的視圖結果。
在這里插入圖片描述
在讀已提交的隔離級別中, Read View的讀取規則是有變化的,在可重復讀中只有第一次查詢的 Read View視圖會從表里面拿最新的數據而在讀已提交的隔離級別中每一次查詢都會去數據庫中拿一份新的來生成一個 Read View最新的值是什么 Read View里面就是什么,底層和可重復讀也是通過版本鏈來比對。

數據庫的一致性

一致性是 ACID 的最終目標,其他三個特性(原子性、隔離性、持久性)以及業務代碼正確邏輯來實現的。
原子性確保事務不殘留中間狀態;
隔離性避免并發事務相互干擾(如臟讀導致的數據邏輯錯誤);
持久性確保已提交的合法狀態不丟失。

持久性

一旦提交了事務,它對數據庫的改變是永久性的,持久性由redo log日志來實現。

REDO LOG 稱為重做日志,提供再寫入操作,恢復提交事務修改的頁操作,用來保證事務的持久性
這篇文章的介紹比較詳細。
【MySql】數據庫Redo日志介紹

事務的優化

事務優化原則
1.將查詢等數據準備操作放到事務外
2.事務中避免遠程調用,若必須進行遠程調用則要設置超時,防止事務等待時間過久
3.事務中避免一次性處理太多數據,可以拆分成多個事務分次處理
4.更新等涉及加鎖的操作盡可能放在事務靠后的位置
5.能異步處理的盡量異步處理
6.應用側(業務代碼)保證數據一致性,采用非事務方式執行(當業務邏輯相對簡單時,可以不依賴數據庫事務,而是通過 Java 等業務代碼手動實現數據一致性保障)

最后避免大事務
在這里插入圖片描述

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

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

相關文章

YOLO--目標檢測基礎

一、基本認知1.1目標檢測的定義目標檢測&#xff08;Object Detection&#xff09;&#xff1a;在圖像或視頻中檢測出目標圖像的位置&#xff0c;并進行分類和識別的相關任務。主要是解決圖像是什么&#xff0c;在哪里的兩個具體問題。1.2使用場景目標檢測的使用場景眾多&#…

GitLab 18.2 發布幾十項與 DevSecOps 有關的功能,可升級體驗【四】

沿襲我們的月度發布傳統&#xff0c;極狐GitLab 發布了 18.2 版本&#xff0c;該版本帶來了議題和任務的自定義工作流狀態、新的合并請求主頁、新的群組概覽合規儀表盤、下載安全報告的 PDF 導出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等幾十個重點功能的改進…

Python----大模型(大模型微調--BitFit、Prompt Tuning、P-tuning、Prefix-tuning、LORA)

一、大模型微調 1.1、解釋 微調(Fine-tuning)是在預訓練大模型基礎上&#xff0c;針對特定領域數據進行二次訓練的技術過程。這一過程使大型語言模型(如GPT、BERT等)能夠更好地適應具體應用場景&#xff0c;顯著提升在專業領域的表現。 1.2、微調的基本流程 模型選擇&#xf…

本地安裝 SQLite 的詳細步驟

方法 1:使用預編譯二進制文件 下載 SQLite: 訪問 SQLite 官方下載頁面。 下載 Precompiled Binaries for Windows 中的 sqlite-tools-win32-x86-*.zip。 解壓文件: 將下載的 ZIP 文件解壓到一個目錄(例如 C:\sqlite)。 配置環境變量: 右鍵「此電腦」→「屬性」→ 左側「高…

專題:2025醫藥生物行業趨勢與投融資研究報告|附90+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43444 圈內人都知道&#xff0c;2024年的BioChina展會現場&#xff0c;某跨國藥企高管盯著融資展板喃喃自語&#xff1a;“去年A輪平均3.2億&#xff0c;今年怎么降到2.1億了&#xff1f;” 這個細節&#xff0c;恰是行業寒冬的縮影…

Chroma安裝教程

Chroma 這里講述的是windows環境 下載Chroma安裝包 下載地址&#xff1a;https://github.com/chroma-core/chroma/releases 運行 chroma-windows.exe run --port 8000通過心跳檢測訪問是否正常 http://localhost:8000/api/v2/heartbeat快速使用 python安裝chromadb pyth…

kali Linux 2025.2安裝教程(解決安裝失敗-圖文教程超詳細)

一&#xff0c;下載鏡像&#xff1a; 進入官網&#xff1a;Get Kali | Kali Linux &#xff0c;往下滑 等待兩年半&#xff0c;鏡像下載好。 二&#xff0c;虛擬機安裝&#xff1a; 轉&#xff1a;VMware Workstation Pro 17 安裝圖文教程 知乎平臺&#xff1a;VMware Work…

uniapp項目使用ucharts實現折線圖詳細講解(案例)

1.在Hbuildx里面的工具>插件安裝&#xff0c;進入DCloud搜索uchart 2.點擊對應的項目導入該插件 可以看到在該目錄下有該插件 3.進入官網演示 - uCharts跨平臺圖表庫&#xff0c;找一個示例代碼測試一下&#xff0c;是否可以成功應用 因為這里使用的是vue2&#xff0c;如果你…

數據分析師進階——95頁零售相關數據分析【附全文閱讀】

這份資料適合零售行業從業者&#xff0c;尤其是服裝銷售領域的人員&#xff0c;能幫大家用數據分析提升銷售業績。資料先提出 “店鋪 20 問”&#xff0c;引導思考店鋪運營問題&#xff0c;接著點明數據分析對提升銷售、找出銷售不佳原因的重要性 。詳細介紹銷售業績相關公式及…

計算機組成原理(6) - 加法器

加法器是數字電路中用于執行加法運算的基本邏輯單元&#xff0c;廣泛應用于計算機、計算器、數字信號處理器等電子設備中。它能將兩個二進制數相加&#xff0c;并輸出結果及可能產生的進位。一、加法器的基本功能加法器的基本功能是在數字電路中對輸入的二進制數執行加法運算&a…

Qt 與 WebService 交互開發

在現代軟件開發中&#xff0c;WebService 已成為實現跨平臺、跨語言通信的重要標準。Qt 作為一個強大的跨平臺框架&#xff0c;提供了完善的工具和類庫來實現與 WebService 的交互。本文將深入探討 Qt 與 WebService 交互開發的核心技術和實踐經驗&#xff0c;包括 SOAP 協議實…

LLM 模型部署難題的技術突破:從輕量化到分布式推理的全棧解決方案

大語言模型(LLM)的部署一直是工業落地的核心挑戰。動輒百億甚至萬億參數的模型規模,對硬件資源、推理速度和系統穩定性提出了嚴苛要求。本文將系統剖析 LLM 部署中的關鍵技術瓶頸,從模型壓縮、推理加速到分布式架構設計,提供可落地的工程化解決方案,并附具體實現代碼。 …

理解訓練深度前饋神經網絡的困難—— 解鎖深度學習的關鍵鑰匙

2010年&#xff0c;深度學習先驅 Xavier Glorot 和 Yoshua Bengio 發表了這篇里程碑式的論文。它精準地診斷了當時阻礙深度神經網絡發展的核心頑疾——**梯度消失/爆炸問題**&#xff0c;并開出了革命性的“藥方”&#xff1a;**Xavier/Glorot 初始化**。這篇論文掃清了訓練深度…

Objective-c 初階——異常處理(try-catch)

一、try/catch/throw/finally 執行順序 void doSomething() {NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init];try {// 這一步拋異常[self riskyMethod]; } catch (NSException *e) {throw; // 把異常繼續往上拋} finally {// ? 注意&#xff1a;這里的 finally…

計算機網絡:(十二)傳輸層(上)運輸層協議概述

計算機網絡&#xff1a;&#xff08;十一&#xff09;多協議標記交換 MPLS前言一、運輸層的作用二、基于端口的復用和分用功能三、屏蔽作用四、可靠信道與不可靠信道五、運輸層的兩個主要協議前言 前面我們講解了計算機網絡中網絡層的相關知識&#xff0c;包括網絡層轉發分組的…

一場關于電商零售增長破局的深圳探索

“電商AI&#xff0c;不再是選擇題”2025年&#xff0c;電商行業正面臨流量成本攀升、用戶留存率下降、供應鏈協同效率低等核心困境&#xff0c;傳統數字化工具已難以滿足精細化運營需求。在此背景下&#xff0c;百度智能云正加速布局電商領域&#xff0c;為零售企業提供從基礎…

當非洲愛上“中國制造”:如何贏在起跑線

非洲大陸的消費浪潮正以前所未有的速度奔涌。2025年前五個月&#xff0c;中非貿易額同比暴漲12.4%&#xff0c;創下歷史新高。在這片擁有14億人口的土地上&#xff0c;60%是30歲以下的年輕人&#xff0c;城鎮化浪潮席卷、中產階級快速崛起&#xff0c;從家電、汽車到建材、電子…

vLLM(3)vllm在線啟動集成openweb-ui

文章目錄**步驟 1: 啟動 vLLM 服務****方式 1: 直接命令行啟動****方式 2: Docker 啟動****步驟 2: 配置 Open WebUI 連接 vLLM****方法 1: 修改 Open WebUI 環境變量****方法 2: 通過 docker-compose.yml 部署****步驟 3: 在 Open WebUI 中添加模型****驗證是否成功****常見問…

Python----大模型(基于Agent的私人AI助理項目)

開發一個智能的問答系統&#xff0c;該系統支持用戶聊天&#xff0c;傳輸文件。通過自然語言處理技術&#xff0c;機器人能夠理解用戶的意圖。機器人將利用互聯網搜索引擎來補充信息&#xff0c;確保用戶能夠獲得全面且準確的回答。 一、web ui界面 我們采用gradio來編寫的ui界…

Python爬蟲實戰:研究scrapely庫相關技術構建電商數據提取系統

1. 引言 在當今數字化時代,網絡上蘊含著海量的有價值信息。如何從這些非結構化的網頁中自動提取出結構化的數據,成為了數據挖掘和信息檢索領域的重要研究課題。網絡爬蟲作為一種自動獲取網頁內容的技術,被廣泛應用于信息收集、數據分析等領域。然而,網頁結構的多樣性和復雜…