Mysql事務原理

臟讀(Dirty Read)
某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個進行了RollBack,則后一個事務所讀取的數據就會是不正確的。

不可重復讀(Non-repeatable read)
在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新了原有的數據。

幻讀(Phantom Read)
在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

事務隔離級別

由低到高依次為Read uncommitted、Read committed、Repeatable read、Serializable,這四個級別可以逐個解決臟讀、不可重復讀、幻讀這幾類問題

READ-UNCOMMITTED(讀取未提交): 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、不可重復讀和幻讀。
READ-COMMITTED(讀取已提交): 允許讀取并發事務已經提交的數據,可以阻止臟讀,但是不可重復讀和幻讀仍有可能發生。
REPEATABLE-READ(可重復讀): 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生。
SERIALIZABLE(可串行化): 最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。

Mysql 默認采用的 REPEATABLE_READ隔離級別
事務隔離機制的實現基于鎖機制和并發調度。其中并發調度使用的是MVVC(多版本并發控制),通過保存修改的舊版本信息來支持并發一致性讀和回滾等特性。
因為隔離級別越低,事務請求的鎖越少,所以大部分數據庫系統的隔離級別都是READ-COMMITTED(讀取提交內容):
但是InnoDB 存儲引擎默認使用 REPEATABLE-READ(可重讀)并不會有任何性能損失。

隔離級別與鎖的關系

  1. 在Read Uncommitted
    讀操作:不加鎖,讀讀,讀寫,寫讀并行;
    寫操作:加排他鎖且直到事務提交后才釋放。

  2. 在Read Committed級別下
    讀操作:加共享鎖,操作完立即釋放; 短鎖
    寫操作:加排他鎖且直到事務提交后才釋放;
    讀操作不會阻塞其他事務讀或寫,寫操作會阻塞其他事務寫和讀,因此可以防止臟讀問題。

  3. 在Repeatable Read級別
    讀操作:加S鎖且直到事務提交后才釋放; 長鎖
    寫操作:加X鎖且直到事務提交后才釋放;
    讀操作不會阻塞其他事務讀但會阻塞其他事務寫;
    寫操作會阻塞其他事務讀和寫,因此可以防止臟讀、不可重復讀。

  4. SERIALIZABLE 是限制性最強的隔離級別,讀寫數據都會鎖住整張表
    讀操作:加X鎖且直到事務提交后才釋放; 長鎖
    寫操作:加X鎖且直到事務提交后才釋放;
    粒度為表鎖,也就是嚴格串行

事務實現原理

原子性、一致性、持久性通過數據庫的redo和undo來完成。隔離性由鎖得以實現。

1.持久性的保證:

  • Checkpoint技術:當每次數據頁臟了之后,立馬就將緩沖頁刷回磁盤,對性能影響太大,故MySQL一般會使用checkpoint技術。
    checkpoint點的設置比較復雜,MySQL會綜合考慮redo log的大小,系統宕機之后的數據恢復時間、緩沖池的使用情況等等來取一個checkpoint,將臟頁刷到磁盤。
    而一旦將數據刷到磁盤后,那么checkpoint之前的數據操作持久性就都得到保證了。

  • Write ahead log策略:
    當事務提交時,先寫重做日志,再修改頁。
    WAL 技術的基本思想是先將修改操作記錄到 redo log 中,再將數據寫入磁盤中。這樣可以確保在出現宕機等異常情況時,可以通過 redo log 中的信息將數據恢復到事務執行前的狀態,從而保證數據的一致性和持久性。

Redo log的持久化策略
show variables like ‘innodb_flush_log_at_trx_commit’;
0:表示事務提交時不將日志寫到磁盤,而是每次都把redo緩沖起來,僅僅在master thread中每一秒進行一次fsync
1:默認值為,表示每次事務提交時必須調用一次fsync將log寫到磁盤
2:每次事務提交時MySQL都會把log buffer的數據寫入log file,但是flush(刷到磁盤)操作并不會同時進行。MySQL會每秒執行一次 flush(刷到磁盤)操作

2.隔離性的實現

在執行SQL寫某一行的時候,是需要把要寫的行上加X鎖的,MySQL在默認設置下讀是不加鎖的快照讀

當前讀:讀取的是記錄的最新版本,讀取時需保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖,
對于我們的日常操作,如:select…lock in share mode(共享鎖),select…for update、update、insert、delete(排他鎖)都是當前讀。

快照讀:簡單的select(不加鎖)就是快照讀,快照讀記錄的是數據的可見版本,有可能是歷史數據,不加鎖,是非阻塞讀。
Read Committed:每次select 生成一個快照讀。
Repeatable Read:開啟事務后的第一個select語句才是快照讀的地方
Serializable:快照讀會退化為當前讀

undolog版本鏈
當insert操作時,產生的undo log日志只在回滾時需要,在事務提交后可立即刪除。
當update,delete操作時,產生的undo log日志不僅在回滾時需要,在快照讀時也需要,不會立即被刪除。

MVCC:MVCC 技術通過為每個事務保存一個可見的數據版本,來實現在并發訪問的情況下保證事務的隔離性。
MVCC 主要涉及以下兩個方面:
版本號:在 MVCC 中,每一行數據都會有多個版本號,每個版本號對應著一個事務,表示該版本是由該事務所修改的。
事務在進行修改時,會為該行數據生成一個新的版本,該版本號比當前最大的版本號大1。而查詢操作只能讀取版本號小于等于當前事務的版本號的數據。
事務版本鏈:每個事務都有一個版本鏈,版本鏈是由該事務創建的所有版本所組成的鏈表。
在該鏈表上,每個版本都指向前一個版本,最后一個版本指向 NULL。
版本鏈的作用是,當事務需要回滾時,可以沿著版本鏈將數據恢復到事務開始的狀態。

通過使用版本號和事務版本鏈,MVCC 實現了 InnoDB 存儲引擎的多版本并發控制,同時也保證了事務的隔離性。
在執行查詢操作時,根據當前事務的隔離級別,InnoDB 存儲引擎會選擇可見的數據版本。
在可重復讀的隔離級別下,InnoDB 存儲引擎會將當前事務的版本號作為可見的最大版本號,因此當前事務只能讀取該版本號之前的數據版本,避免了臟讀和不可重復讀等問題。

MVCC只在可重復對和RC隔離級別下生效,不同的是RR級別下在事務第一個select語句開始的時候生成快照讀視圖,RC級別下每次select都會生成新的讀視圖

3.原子性的實現

通過回滾操作保證原子性。回滾需要用到undo log來進行回滾。
當一個事務需要修改一行數據時,InnoDB 首先將該行數據的原始值拷貝到 undo log 中,然后執行修改操作。
如果事務需要回滾,可以使用 undo log 中的原始值將數據恢復到修改前的狀態。
如果事務提交,則可以將 undo log 中的信息刪除
undo log 通過保存數據的原始值來保證事務的原子性,可以使得數據修改操作能夠撤銷和回滾,并確保數據的一致性

如果部分提交事務,可以參考Save point命令

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

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

相關文章

小紅書筆記詳情API指南

一、引言小紅書作為中國領先的社交電商平臺,擁有超過4.8億用戶(2025年Q2數據),其開放平臺已成為品牌營銷與數據挖掘的重要渠道?1。通過筆記詳情API獲取數據,可以幫助商家、品牌方和數據分析人員了解用戶反饋、市場趨勢和消費需求?。這些數據…

VS+Qt中使用QCustomPlot繪制曲線標簽(附源碼)

在qt中我們常常會使用數據來繪制曲線,常用的的繪制方法用QCutomPlot、QChart和QPrinter。有時我們會根據需要在曲線進行二次繪制,包括對曲線打標簽,顯示某個點的值等功能。本文主要為大家介紹在QCustomPlot中使用QCPItemTracer和QCPItemText繪…

Spring Boot項目生產環境部署完整指南

在Spring Boot應用開發完成后,如何將其穩定、高效地部署到生產環境是每個開發者都需要掌握的關鍵技能。本文將詳細介紹Spring Boot項目的多種部署方案,從傳統部署到現代化容器部署,選擇最適合的部署策略。 1. 部署前的準備工作 1.1 項目打包優…

微信小程序中實現頁面跳轉的方法

微信小程序中頁面跳轉主要有兩種方式:聲明式導航(通過組件實現)和編程式導航(通過API實現)。兩種方式適用于不同場景,以下詳細說明。一、聲明式導航(navigator組件)通過小程序內置的…

從0開始學linux韋東山教程Linux驅動入門實驗班(7)

本人從0開始學習linux,使用的是韋東山的教程,在跟著課程學習的情況下的所遇到的問題的總結,理論雖枯燥但是是基礎。本人將前幾章的內容大致學完之后,考慮到后續驅動方面得更多的開始實操,后續的內容將以韋東山教程Linux驅動入門實…

國內AI IDE競逐:騰訊CodeBuddy、阿里通義靈碼、字節跳動TRAE、百度文心快碼

國內AI IDE競逐:騰訊CodeBuddy、阿里通義靈碼、字節跳動TRAE、百度文心快碼 隨著人工智能技術的不斷發展,各大科技公司紛紛推出自家的AI IDE,推動軟件開發進入全新的智能化時代。騰訊的 CodeBuddy IDE、阿里云的 通義靈碼 AI IDE、字節跳動的…

git rebase使用教程 以及和merge的區別

Merge和Rebase概念概述 rebase 和 merge 相似,但又不完全相同,本質上都是用來合并分支的命令,區別如下 merge合并分支會多出一條merge commit記錄,而rebase不會merge的提交樹是非線性的,會有分叉,而rebase的…

React中的合成事件解釋和理解

什么是合成事件(Synthetic event)?它和原生事件有什么區別?解題思路:解釋合成事件,然后對比原生事件,然后再說他的優勢1.一致性 在 react里面,這個合成事件是非常重要的,因為它就是為了解決瀏覽器之間與事…

【Python系列】使用 memory_profiler 診斷 Flask 應用內存問題

博客目錄一、內存分析的重要性二、memory_profiler 基礎使用安裝與基本配置理解分析報告三、在 Flask 應用中使用 memory_profiler裝飾視圖函數使用 mprof 進行長期監控四、高級內存分析技巧精確測量代碼塊內存定期內存采樣結合 objgraph 分析對象引用五、常見內存問題及解決方…

vue3【組件封裝】超級表單 S-form.vue

最終效果 代碼實現 components/SUI/S-form.vue <script lang"ts" setup> import type { FormInstance } from "element-plus";// 使用索引簽名定義對象類型 type GenericObject {[key: string]: any; };const props defineProps<{Model?: Gen…

Android Studio Memory Monitor內存分析核心指標詳解

Depth、Native Size、Shallow Size、Retained Size 解析 一、指標定義與對比指標定義計算邏輯重要性Shallow Size對象自身實例占用的內存基本類型字段大小 引用指針 內存對齊對象的基礎內存成本Retained Size回收該對象可釋放的總內存量&#xff08;含所有依賴對象&#xff0…

vue中使用wavesurfer.js繪制波形圖和頻譜圖(支持.pcm)

新的實現方式&#xff1a;vue使用Canvas繪制頻譜圖 安裝wavesurfer.js npm install wavesurfer.js第一版&#xff1a; 組件特點&#xff1a; 一次性加載好所有的數據&#xff1b; <template><div class"audio-visualizer-container"><div class&…

go mod教程、go module

什么是go mod go mod 是go語言的包管理工具&#xff0c;類似java 的maven&#xff0c;go mod的出現可以告別goPath&#xff0c;使用go module來管理項目&#xff0c;有了go mod賬號就不需要非得把項目放到gopath/src目錄下了&#xff0c;你可以在磁盤的任何位置新建一個項目 go…

150-SWT-MCNN-BiGRU-Attention分類預測模型等!

150-SWT-MCNN-BiGRU-Attention分類預測模型!基于多尺度卷積神經網絡(MCNN)雙向長短期記憶網絡(BiGRU)注意力機制(Attention)的分類預測模型&#xff0c;matlab代碼&#xff0c;直接運行使用&#xff01;1、模型介紹&#xff1a;針對傳統方法在噪聲環境下診斷精度低的問題&#…

MySQL數據一致性與主從延遲深度解析:從內核機制到生產實踐

在高并發分布式系統中&#xff0c;數據一致性與復制延遲如同硬幣的兩面。本文深入剖析MySQL持久化機制與主從同步原理&#xff0c;并提供可落地的調優方案。一、數據持久化核心機制&#xff1a;雙日志協同 1. Redo Log&#xff1a;崩潰恢復的生命線刷新策略&#xff08;innodb_…

【I】題目解析

目錄 單選題 多選題 判斷題 單選題 1.reg[7:0]A; A2hFF;則A&#xff08;&#xff09; A.8b11111110 B.8b03 C.8b00000011 D.8b11111111 C 2hFF實際上等效于2位二進制2b11&#xff0c;賦值給8位寄存器A之后&#xff0c;低位賦值&#xff0c;高位補0 A8b00000011 AMD FPG…

《Foundation 面板:設計、功能與最佳實踐解析》

《Foundation 面板:設計、功能與最佳實踐解析》 引言 在當今數字化時代,用戶界面(UI)設計的重要性不言而喻。其中,Foundation 面板作為一種流行的前端框架,因其靈活性和高效性而被眾多開發者所青睞。本文將深入解析 Foundation 面板的設計理念、功能特點以及最佳實踐,…

React服務端渲染 Next 使用詳解

1. Next.js 概述 Next.js 是一個基于 React 的開源框架&#xff0c;專注于服務器端渲染&#xff08;SSR&#xff09;和靜態站點生成&#xff08;SSG&#xff09;&#xff0c;提供開箱即用的 SSR 功能&#xff0c;簡化 React 應用的開發與部署。 2. Next.js 的核心特性 SSR 支…

Deforum Stable Diffusion,輕松實現AI視頻生成自由!

摘要&#xff1a; 你是否曾被那些充滿想象力、畫面流暢的AI視頻所震撼&#xff1f;你是否也想親手創造出屬于自己的AI動畫&#xff1f;本文將為你提供一份“保姆級”的詳盡教程&#xff0c;從環境配置到參數調整&#xff0c;一步步帶你復現強大的Deforum Stable Diffusion模型&…

不同環境安裝配置redis

不同環境安裝配置redis windows 環境安裝redis redis所有下載地址 windows版本redis下載&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推薦使用&#xff09;https://github.com/MicrosoftArchive/redis/releases]官…