MySQL事務篇1:事物的四大特性(ACID)、三類數據讀取問題與隔離級別

一、什么是事務?

? ? ? ? MySQL的事務(Transaction)是一組由數據庫管理系統(DBMS)執行的一個或多個SQL語句的集合,這些SQL語句作為一個單獨的工作單元執行。事務的主要目的是確保數據庫的一致性和完整性,特別是在并發環境下。這些操作要么全部都執行,要么都不執行, 它是一個不可分割的工作執行單元。

二、事務的特性

????????事務是由[MySQL 的引擎]來實現的,我們常見的 InnoDB 引擎它是支持事務的。不過并不是所有的引擎都能支持事務,比如 MySQL 原生的 MyISAM 引擎就不支持事務,也正是這樣,所以大多數 MySQL 的引擎都是用 InnoDB。
????????事務有四個關鍵特性,通常被稱為ACID特性。這四個特性是:

1、原子性(Atomicity):
????????事務中的所有操作要么全部成功,要么全部失敗。即事務是一個不可分割的工作單元。即使在事務執行過程中發生了錯誤,事務中的任何更改都不會保留,系統會回滾(Undo)所有已經執行的操作,使數據庫回到事務開始之前的狀態。

2、一致性(Consistency)
????????事務從一個一致的數據庫狀態轉換到另一個一致的數據庫狀態。數據庫在事務開始之前和結束之后都必須滿足所有的定義的約束、觸發器和規則。換句話說,事務開始前和事務結束后數據應該是一致的,例如張三有300,李四有400,那么無論他們如何轉賬,總錢數700應該是不變的

3、隔離性(Isolation)
????????事務的執行過程對其他事務是隔離的。即使多個事務并發執行,每個事務也無法看到其他事務未提交的中間狀態,即多個并發事務直接要相互隔離,互不干擾。隔離性保證了并發事務的正確執行。MySQL提供了不同的隔離級別來控制事務之間的隔離程度,包括未提交讀、提已交讀、可重復讀和可序列化。

4、持久性(Durability)
????????一旦事務提交,所做的更改將永久保存到數據庫中,即使發生系統故障,數據也不會丟失。持久性通過將事務的日志記錄到持久存儲設備(如磁盤)上來實現。提交事務后,系統保證即使系統崩潰,也能通過日志恢復已提交的數據。

InnoDB 引擎通過什么技術來保證事務的這四個特性的呢?

  • 持久性是通過 redo log (重做日志)來保證的;
  • 原子性是通過 undo log(回滾日志) 來保證的;
  • 隔離性是通過 MVCC(多版本并發控制)或鎖機制來保證的;
  • 一致性則是通過持久性+原子性+隔離性來保證;

簡單知道一下即可,這是一個非常復雜的底層邏輯。

三、并發事務下三類數據讀取問題與數據更新

???????MySQL 服務端是允許多個客戶端連接的,這意味著 MySQL 會出現同時處理多個事務的情況。主要有三類數據讀取問題:

1、臟讀(Dirty Read):
????????一個事務能夠讀取另一個事務尚未提交的數據。這種情況會導致讀取的數據可能在未來被回滾,從而導致讀取到不正確的數據。
?示例:事務A更新了某行數據,然后事務B讀取了這些更新的數據。然而,事務A隨后回滾了,這意味著事務B讀到了未提交的、隨后被撤銷的數據。

2、不可重復讀(Non-Repeatable Read):

????????一個事務在讀取某行數據后,再次讀取該行數據時,發現數據已經被另一個已提交的事務修改了兩次讀取同一數據的結果不一致

示例:事務A在某時刻讀取了一行數據。然后事務B更新了這行數據并提交。事務A再次讀取該行數據時,發現數據已經改變。

3、幻讀(Phantom Read):

? ? ? ? 一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現了“幻影”。

示例:事務A讀取了滿足某個條件的所有數據行。事務B插入了一些滿足這個條件的新數據行并提交。事務A再次讀取時,發現多了一些之前沒有的數據行。

????????我們對三類數據讀取問題做一個總結就是:

臟讀:讀到其他事務未提交的數據;

不可重復讀:前后讀取的數據不一致;

幻讀:前后讀取的記錄數量不一致。

????????在并發事務下,不僅會遇到數據讀取問題,還會遇到數據更新問題,主要有以下兩類:

丟失更新(Lost Update)

????????兩個事務都讀取同一數據并修改它們中的一個,導致一個事務的修改被另一個事務的修改覆蓋,最終的更新丟失。這種情況通常發生在沒有合適的鎖機制來同步并發事務時。

示例:事務A和事務B都讀取了同一行數據,然后事務A和事務B都修改了這行數據并提交。事務A的修改被事務B的修改覆蓋,導致事務A的更新丟失。

不可重復寫(Non-Repeatable Write)

????????一個事務在寫入某行數據后,另一個事務修改了這行數據。當第一個事務再次寫入這行數據時,發現數據已經被另一個事務改變了。這種情況導致數據的不一致性。

示例:事務A和事務B同時讀取同一行數據。事務A先修改了數據并提交,事務B再修改數據并提交,事務A的更改可能沒有被考慮在內。

四、事務隔離級別

前面我們提到,當多個事務并發執行時可能會遇到【臟讀、不可重復讀、幻讀】的現象,這些現象會對事務的一致性產生不同程序的影響。SQL 標準提出了四種隔離級別來規避這些現象,隔離級別越高,性能效率就越低,這四個隔離級別如下:

  • 讀未提交:指一個事務還沒提交時,它做的變更就能被其他事務看到。
  • 讀提交:指一個事務提交之后,它做的變更才能被其他事務看到。
  • 可重復讀:指一個事務執行過程中看到的數據,一直跟這個事務啟動時看到的數據是一致的,MySQL InnoDB 引擎的默認隔離級別。
  • 串行化:會對記錄加上讀寫鎖,在多個事務對這條記錄進行讀寫操作時,如果發生了讀寫沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行。

????????不同的數據庫廠商對 SQL 標準中規定的 4 種隔離級別的支持不一樣,有的數據庫只實現了其中幾種隔離級別,MySQL 雖然支持 4 種隔離級別,但是與SQL 標準中規定的各級隔離級別允許發生的現象卻有些出入。(隔離級別的定義由SQL提出,這不是MySQL規定的)
????????MySQL InnoDB 引擎在可重復讀隔離級別下,可以很大程度上避免幻讀現象的發生,所以 MySQL 并不會使用串行化隔離級別來避免幻讀現象的發生,因為使用串行化隔離級別會嚴重影響性能(畢竟是悲觀鎖)。而關于為什么可以很大程度上避免幻讀現象的發生,這就是涉及到了一個概念叫做MVCC。

????????多版本并發控制(MVCC,Multi-Version Concurrency Control)是一種用于提高數據庫系統并發性能的技術。它允許多個事務在不加鎖的情況下并發讀取和寫入數據,從而避免了許多鎖競爭問題。MVCC通過保存數據的多個版本來實現一致性和隔離性。關于更多MVCC的東西可以看我的另一篇文章。?

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

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

相關文章

藍橋杯2023(十四屆)省賽——飛機降落(雙馬尾DFS)

飛機降落(DFS) 藍橋杯2023年第十四屆省賽真題-飛機降落 - C語言網 (dotcpp.com) 一開始我是真的沒想到用DFS做,我還在想用什么策略排序呢。需要再刷!!! 雙馬尾的意思其實是刷了兩次... 一刷&#xff1a…

leecode 637 二叉樹的層平均值

leetcode 二叉樹相關-層序遍歷專題 二叉樹的層序遍歷一般來說,我們是利用隊列來實現的,先把根節點入隊,然后在出隊后將其對應的子節點入隊,然后往復此種操作。相比于二叉樹的遍歷遞歸,層序遍歷比較簡單,有…

CHI協議_1

作者:someone鏈接:https://www.zhihu.com/question/304259901/answer/3455648666來源。 1. AMBA CHI簡介 一致性總線接口(CHI)是AXI一致性擴展(ACE)協議的演進。它是Arm的AMBA總線的一部分。AMBA是一種免…

美團Java社招面試題真題,最新面試題

如何處理Java中的內存泄露? 1、識別泄露: 使用內存分析工具(如Eclipse Memory Analyzer Tool、VisualVM)來識別內存泄露的源頭。 2、代碼審查: 定期進行代碼審查,關注靜態集合類屬性和監聽器注冊等常見內…

VueJS ReactJS實現AI問答小助手(2)——流式TTS文字轉實時語音播放

TTS(Text-to-speech)文字轉語音使用的是阿里云的服務,文檔地址: https://help.aliyun.com/zh/isi/developer-reference/streaming-text-tts-wss 文檔只給出了一些配置項的說明,以及java端的代碼示例,但沒有web端的。所以這篇筆記可以給web開發者參考。 首先,AI答復的消息…

.NET File Upload

VS2022 .NET8 &#x1f4be;基礎上傳示例 view {ViewData["Title"] "File Upload"; }<h1>ViewData["Title"]</h1><form method"post" enctype"multipart/form-data" action"/Home/UploadFile"…

Android 系統日志(Log) JNI實現流程源碼分析

1、JNI概述 Java Native Interface (JNI) 是一種編程框架&#xff0c;使得Java代碼能夠與用其他編程語言&#xff08;如C和C&#xff09;編寫的本地代碼進行交互。JNI允許Java代碼調用本地代碼的函數&#xff0c;也允許本地代碼調用Java代碼的函數。下面是對JNI機制的詳細概述…

【單片機】STM32F070F6P6 開發指南(一)STM32建立HAL工程

文章目錄 一、基礎入門二、工程初步建立三、HSE 和 LSE 時鐘源設置四、時鐘系統&#xff08;時鐘樹&#xff09;配置五、GPIO 功能引腳配置六、配置 Debug 選項七、生成工程源碼八、生成工程源碼九、用戶程序下載 一、基礎入門 f0 pack下載&#xff1a; https://www.keil.arm…

【OpenCV 基礎知識 19】拉普拉斯變換

功能&#xff1a; cvLaplace 是計算圖像的 Laplacian 變換 &#xff0c;是Intel開源項目opencv中的函數 函數形式&#xff1a; void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size3 ); 參數列表&#xff1a; Src 輸入圖像. Dst 輸出圖像. aperture_size算子內…

離線初始化k8s

導出和導入所有必要的 Kubernetes 鏡像&#xff0c;使用阿里云作為源。 在能訪問外網的機器上拉取鏡像 首先&#xff0c;在有外網訪問的機器上運行以下命令來拉取所有 Kubernetes v1.29.5 版本需要的鏡像&#xff1a; kubeadm config images pull --image-repository regist…

大模型應用:基于Golang實現GPT模型API調用

1.背景 當前OpenAI提供了開放接口&#xff0c;支持通過api的方式調用LLM進行文本推理、圖片生成等能力&#xff0c;但目前官方只提供了Python SDK。為了后續更方便集成和應用&#xff0c;可以采用Golang對核心推理調用接口進行封裝&#xff0c;提供模型調用能力。 2.相關準備…

Spark運行模式詳解

Spark概述 Spark 可以在多種不同的運行模式下執行&#xff0c;每種模式都有其自身的特點和適用場景。 部署Spark集群大體上分為兩種模式&#xff1a;單機模式與集群模式。大多數分布式框架都支持單機模式&#xff0c;方便開發者調試框架的運行環境。但是在生產環境中&#xff…

軟件web化的趨勢

引言 在信息技術飛速發展的今天&#xff0c;軟件Web化已成為一個不可忽視的趨勢。所謂軟件Web化&#xff0c;即將傳統的桌面應用軟件轉變為基于Web的應用程序&#xff0c;使用戶能夠通過瀏覽器進行訪問和使用。傳統軟件通常需要在用戶的計算機上進行安裝和運行&#xff0c;而W…

Cadence OrCAD學習筆記(3)capture使用技巧_1

本期介紹capture的一些使用技巧。資料來源于小破站up主硬小二 1、導出像Visio規格的圖紙 2、全局修改元件屬性 然后保存、關閉即可。 3、導出BOM 4、導出網表 5、元件自動編號 6、capture軟件和allegro關聯 7、新建原理圖symbol 以上為添加封裝庫的路徑 如果要創建多部分的sy…

積累|新質生產力之地方發展的不同賽道

“不要搞一種模式”。任何事物都是共性和個性的統一&#xff0c;也就是矛盾普遍性和特殊性的統一。就發展新質生產力而言&#xff0c;既要遵循新質生產力的普遍規律和共同特征&#xff0c;又要充分考慮各地、各產業的實際情況和特殊性&#xff0c;準確把握共性與個性。 總述 …

神器EasyRecovery2024中文電腦版下載!讓數據恢復不再難

在數字化時代&#xff0c;數據就是我們的財富。無論是重要的工作報告&#xff0c;還是那些珍貴的生活瞬間照片&#xff0c;或是我們與朋友間的聊天記錄&#xff0c;都儲存在我們的電腦或手機中。然而&#xff0c;有時候&#xff0c;意外總是突如其來&#xff0c;電腦突然崩潰&a…

C++Qt操作Lotus Domino數據庫 Lotus Domino C++連接Lotus Domino C++快速開發Lotus Domino

java連接domino C#連接domino python連接domino go連接domino,delphi連接domino Excel連接domino Flutter、微信小程序連接domino C 操作 Lotus Domino 數據庫&#xff1a;自動化與效率的結合 引言 在企業級應用中&#xff0c;Lotus Domino 提供了一個強大的協作平臺&#xff0…

【Linux】TCP協議【下一】{三次握手/四次揮手的深度解讀==狀態變化}

文章目錄 本篇知識需要有TCP協議【中】的知識&#xff01;詳情點擊&#x1f447;1.測試一&#xff1a;服務器start函數不定義任何行為&#xff08;不調用accept&#xff09;的三次握手狀態變化int listen(int sockfd, int backlog);的backlog參數全連接隊列當全連接隊列已滿&am…

BGP策略實驗(路徑屬性和選路規則)

要求&#xff1a; 1、使用preval策略&#xff0c;確保R4通過R2到達192.168.10.0/24 2、使用AS Path策略&#xff0c;確保R4通過R3到達192.168.11.0/24 3、配置MED策略&#xff0c;確保R4通過R3到達192.168.12.0/24 4、使用Local Preference策略&#xff0c;確保R1通過R2到達19…

Python輕松玩轉excel操作指導

目錄 一、一圖概覽 二、表格操作 三、內容操作 四、單元格操作 五、Pandas實現表格操作 六、常見場景示例 一、一圖概覽 ? ?本文主要對openpyxl庫的常用表格操作進行了梳理&#xff0c;熟練的運用后可極大地提升工作效率。 二、表格操作 #創建一個表格sheet.xlsx #…