MySQL中的事務隔離級別有哪些

MySQL中的事務隔離級別

  • 一、事務并發問題
  • 二、MySQL 事務隔離級別
    • 1. READ UNCOMMITTED(讀未提交)
    • 2. READ COMMITTED(讀已提交)
    • 3. REPEATABLE READ(可重復讀)(MySQL 默認級別)
    • 4. SERIALIZABLE(可串行化)
  • 三、MySQL 默認事務隔離級別
  • 四、不同隔離級別對并發問題的影響
  • 五、如何選擇合適的隔離級別?
  • 總結

在MySQL中,事務(Transaction)是一個執行單元,它要么完全執行,要么完全回滾,以保證數據的完整性和一致性。事務的隔離性(Isolation)是ACID特性之一,它控制了多個事務同時執行時,數據的可見性。MySQL 提供了四種事務隔離級別,每種級別都會影響事務之間的相互影響程度。

一、事務并發問題

在多個事務同時操作同一份數據時,可能會出現以下幾種并發問題:

  1. 臟讀(Dirty Read):一個事務讀取了另一個未提交事務修改的數據,如果后者回滾,則前者讀取到的數據是無效的。
  2. 不可重復讀(Non-repeatable Read):同一個事務中,執行兩次相同的查詢,由于另一個事務的提交,查詢結果不同。
  3. 幻讀(Phantom Read):一個事務在兩次查詢之間,另一事務插入或刪除了數據,導致前后查詢的記錄數不一致。

為了避免這些問題,SQL 標準定義了四種事務隔離級別,MySQL 也支持這四種級別。

二、MySQL 事務隔離級別

MySQL 通過 SET TRANSACTION ISOLATION LEVEL 語句來設置事務隔離級別:

SET SESSION TRANSACTION ISOLATION LEVEL <級別>;
SET GLOBAL TRANSACTION ISOLATION LEVEL <級別>;

其中 <級別> 可以是 READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

1. READ UNCOMMITTED(讀未提交)

  • 特點

    • 事務可以讀取其他未提交事務的數據。
    • 可能發生“臟讀”問題。
    • 性能較好,因為不會使用鎖限制讀取。
  • 示例

    • 事務A修改了一條記錄但尚未提交。
    • 事務B在事務A提交之前讀取了修改后的數據。
    • 如果事務A回滾,那么事務B讀取到的數據就是“臟數據”。
  • 適用場景

    • 允許讀取未提交的數據,適用于不太關心數據一致性的應用,如日志記錄、監控數據等。

2. READ COMMITTED(讀已提交)

  • 特點

    • 只能讀取已經提交的數據,避免了“臟讀”。
    • 可能發生“不可重復讀”問題。
    • MySQL InnoDB 通過 MVCC(多版本并發控制)來實現此隔離級別。
  • 示例

    • 事務A讀取一條記錄。
    • 事務B修改該記錄并提交。
    • 事務A再次讀取該記錄,發現數據發生了變化(不可重復讀)。
  • 適用場景

    • 適用于大多數 OLTP(在線事務處理)系統,如銀行轉賬、訂單管理系統,保證讀取的數據是已提交的但允許數據更新。

3. REPEATABLE READ(可重復讀)(MySQL 默認級別)

  • 特點

    • 事務內多次讀取同一條數據時,數據保持一致(即使其他事務修改并提交了數據)。
    • 通過 MVCC 實現可重復讀。
    • 避免了“臟讀”和“不可重復讀”。
    • 但仍然可能發生“幻讀”問題。
  • 示例

    • 事務A第一次讀取某條數據。
    • 事務B修改該數據并提交。
    • 事務A再次讀取該數據,發現數據未改變(因為事務A讀取的是事務開始時的快照)。
  • 如何解決幻讀?

    • MySQL InnoDB 通過 間隙鎖(Next-Key Locking) 機制來解決幻讀問題,即鎖住范圍,使得其他事務無法插入新的數據,從而防止幻讀。
  • 適用場景

    • 適用于高并發場景,尤其是金融行業,如銀行賬戶查詢和訂單管理系統。

4. SERIALIZABLE(可串行化)

  • 特點

    • 最高級別的隔離,完全避免臟讀、不可重復讀和幻讀。
    • 事務必須依次執行,不能并行,通常會使用 表鎖行鎖
    • 并發性能極差,適用于對數據一致性要求極高的場景。
  • 示例

    • 事務A讀取某一條數據,同時事務B必須等事務A完成后才能讀取或修改該數據。
  • 適用場景

    • 適用于需要嚴格數據一致性的場景,如財務結算、票務系統等。

三、MySQL 默認事務隔離級別

MySQL InnoDB 存儲引擎的默認事務隔離級別是 REPEATABLE READ(可重復讀),這與 SQL 標準的默認級別(READ COMMITTED)不同。MySQL 通過 MVCC(多版本并發控制)和 間隙鎖 解決了幻讀問題,因此 REPEATABLE READ 在 MySQL 中比 SQL 標準更強

如果想修改默認的事務隔離級別,可以在 my.cnf(MySQL 配置文件)中修改:

[mysqld]
transaction-isolation = REPEATABLE-READ

或在運行時更改:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

四、不同隔離級別對并發問題的影響

隔離級別臟讀(Dirty Read)不可重復讀(Non-repeatable Read)幻讀(Phantom Read)
READ UNCOMMITTED可能發生 ?可能發生 ?可能發生 ?
READ COMMITTED不會發生 ?可能發生 ?可能發生 ?
REPEATABLE READ不會發生 ?不會發生 ?可能發生 ?(MySQL 中不會)
SERIALIZABLE不會發生 ?不會發生 ?不會發生 ?

五、如何選擇合適的隔離級別?

  • READ UNCOMMITTED:適用于對數據一致性要求不高的場景,如日志分析、緩存數據等。
  • READ COMMITTED:適用于大多數業務場景,如電商系統、用戶管理系統等,避免臟讀,提高并發性能。
  • REPEATABLE READ(MySQL 默認):適用于金融系統、庫存管理,保證事務內數據的一致性,防止不可重復讀。
  • SERIALIZABLE:適用于對數據一致性要求極高的場景,如銀行結算、核心財務系統,但性能損耗較大。

總結

  • READ UNCOMMITTED:可能發生臟讀、不可重復讀、幻讀,性能最高但安全性最低。
  • READ COMMITTED:防止臟讀,但可能發生不可重復讀和幻讀。
  • REPEATABLE READ(MySQL 默認):防止臟讀和不可重復讀,MySQL 還能避免幻讀,適用于大多數高并發業務。
  • SERIALIZABLE:所有并發問題都能避免,但性能最差。

MySQL 默認采用 REPEATABLE READ,主要是因為 MySQL 通過 MVCC 解決了大部分的并發問題,既能保持較高的事務隔離級別,又不會影響太多的性能。


MySQL中的事務隔離級別有四種,分別為:

  1. 讀未提交(Read Uncommitted)

    • 該級別允許事務讀取其他事務尚未提交的數據(臟讀)。這意味著一個事務可以讀取到另一個事務中間狀態的數據,可能會導致數據不一致。
  2. 讀已提交(Read Committed)

    • 該級別保證事務只能讀取到已提交的數據,防止臟讀。即使如此,仍然允許發生“不可重復讀”(在同一事務中兩次讀取同一數據,值可能不同,因為另一個事務已經修改了數據并提交)。
  3. 可重復讀(Repeatable Read)

    • 該級別保證在一個事務中多次讀取同一數據時,結果始終一致,避免了“不可重復讀”。但是,仍然可能會出現“幻讀”(即事務讀取的結果集發生了變化,因為另一個事務插入了新的記錄)。
  4. 串行化(Serializable)

    • 這是最高的隔離級別,強制事務串行執行,即事務排隊執行,一個事務在完成之前,其他事務無法訪問相同的數據。這可以完全避免臟讀、不可重復讀和幻讀,但性能會較低。

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

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

相關文章

Python----計算機視覺處理(Opencv:圖像鏡像旋轉)

一、圖像鏡像旋轉 圖像的旋轉是圍繞一個特定點進行的&#xff0c;而圖像的鏡像旋轉則是圍繞坐標軸進行的。圖像鏡像旋轉&#xff0c;也可 以叫做圖像翻轉&#xff0c;分為水平翻轉、垂直翻轉、水平垂直翻轉三種。 通俗的理解為&#xff0c;當以圖片的中垂線為x軸和y軸時&#x…

hibernate 自動生成數據庫表和java類 字段順序不一致 這導致添加數據庫數據時 異常

hibernate 自動生成的數據庫表和java類 字段順序不一致 這導致該書寫方式添加數據庫數據時 異常 User user new User( null, username, email, phone, passwordEncoder.encode(password) ); return userRepository.save(user);Hibernate 默認不會保證數據庫表字段的順序與 Ja…

python|結構的模式匹配match|同步迭代

在 Python 中&#xff0c;模式匹配&#xff08;Pattern Matching&#xff09; 是一種強大的功能&#xff0c;用于根據數據的結構或內容進行匹配和處理。Python 3.10 引入了 match 語句&#xff0c;使得模式匹配更加直觀和靈活。模式匹配可以用于處理復雜的數據結構&#xff0c;…

博客圖床 VsCode + PigGo + 阿里云OSS

關鍵字 寫博客&#xff0c;圖床&#xff0c;VsCode&#xff0c;PigGo&#xff0c;阿里云OSS 背景環境 我想把我在本地寫的markdown文檔直接搬到CSDN上和博客園上&#xff0c;但是圖片上傳遇到了問題。我需要手動到不同平臺上傳文件&#xff0c;非常耗費時間和經歷。 為了解決…

路由器安全研究:D-Link DIR-823G v1.02 B05 復現與利用思路

前言 D-Link DIR-823G v1.02 B05存在命令注入漏洞&#xff0c;攻擊者可以通過POST的方式往 /HNAP1發送精心構造的請求&#xff0c;執行任意的操作系統命令。 漏洞分析 binwalk提取固件&#xff0c;成功獲取到固件。 現在我們已經進入到應用里了&#xff0c;那么我們在進行分析…

c++ 類和對象 —— 下 【復習總結】

1. 深入構造函數 1.1 函數體賦值 前文我們提到&#xff0c;創建對象時&#xff0c;編譯器會調用構造函數給成員變量賦值。但這并不能稱為對對象中成員變量的初始化。因為初始化只能初始化一次&#xff0c;但構造函數體內可以多次賦值。構造函數體中語句只能稱為賦初值 那么&…

【量化科普】Volatility,波動率

【量化科普】Volatility&#xff0c;波動率 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 在金融市場中&#xff0c;波動率&#xff08;Volatility&#xff09;是衡量資產價格變動幅度的一個重要指標。它反映了資產價格的穩定性和風險水平。高波動率意味著資產價格…

PCIe(Peripheral Component Interconnect Express)詳解

一、PCIe的定義與核心特性 PCIe&#xff08;外設組件互連高速總線&#xff09;是一種 高速串行點對點通信協議&#xff0c;用于連接計算機內部的高性能外設。它取代了傳統的PCI、PCI-X和AGP總線&#xff0c;憑借其高帶寬、低延遲和可擴展性&#xff0c;成為現代計算機系統的核…

idea 編譯打包nacos2.0.3源碼,生成可執行jar 包常見問題

目錄 問題1 問題2 問題3 問題4 簡單記錄一下nacos2.0.3&#xff0c;編譯打包的步驟&#xff0c;首先下載源碼&#xff0c;免積分下載&#xff1a; nacos源碼&#xff1a; https://download.csdn.net/download/fyihdg/90461118 protoc 安裝包 https://download.csdn.net…

通過 TTL 識別操作系統的原理詳解

TTL 的工作原理 TTL&#xff08;Time to Live&#xff0c;生存時間&#xff09;是網絡中用于控制數據包生命周期的一個關鍵參數。它通過限制數據包在網絡中可以經過的最大路由跳數&#xff08;或最大轉發時間&#xff09;&#xff0c;確保數據包不會在網絡中無休止地轉發。TTL…

總結Solidity 的數據類型

數據類型 在 Solidity 中&#xff0c;類型系統非常豐富&#xff0c;主要分為 值類型&#xff08;Value Types&#xff09;和 引用類型&#xff08;Reference Types&#xff09;。此外&#xff0c;還有一些特殊類型和全局變量。 一.值類型 布爾型&#xff08;bool&#xff09…

Android audio(8)-native音頻服務的啟動與協作(audiopolicyservice和audioflinger)

音頻策略的構建 1、概述 2、AudiopolicyService 2.1 任務 2.2 啟動流程 2.2.1 加載audio_policy.conf&#xff08;xml&#xff09;配置文件 2.2.2 初始化各種音頻流對應的音量調節點 2.2.3 加載audio policy硬件抽象庫 2.2.4設置輸出設備 ps:audiopatch流程簡介 2.2.5打開輸出設…

DeepSeek:從入門到精通

DeepSeek是什么&#xff1f; DeepSeek是一家專注通用人工智能&#xff08;AGI&#xff09;的中國科技公司&#xff0c;主攻大模型研發與應 用。DeepSeek-R1是其開源的推理模型&#xff0c;擅長處理復雜任務且可免費商用。 Deepseek可以做什么&#xff1f; 直接面向用戶或者支持…

【一起來學kubernetes】17、Configmap使用詳解

前言概述核心特性創建 ConfigMap使用 ConfigMap1. **環境變量**2. **Volume 掛載**3. **命令行參數** 更新與熱重載Docker容器中Java服務使用Configmap**一、通過環境變量注入****步驟說明****示例配置** **二、通過 Volume 掛載配置文件****步驟說明****示例配置** **三、動態…

【八股文】從瀏覽器輸入一個url到服務器的流程

1.url解析與DNS解析 瀏覽器解析用戶輸入的URL&#xff0c;提取協議&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路徑等信息 瀏覽器首先檢查本地DNS緩存和系統DNS緩存&#xff0c;若未命中&#xff0c;查詢本地hosts文件 最后遞歸查詢向本地DNS服務器發起請求&#xff…

網絡空間安全(34)安全防御體系

前言 安全防御體系是一個多層次、多維度的系統&#xff0c;旨在保護組織或個人的信息資產免受各種網絡攻擊和威脅。 一、技術層面 網絡邊界防御 防火墻&#xff1a;部署在網絡邊界&#xff0c;通過設定規則允許或阻止特定流量的進出&#xff0c;保護內部網絡不受外部攻擊。入侵…

Linux 入門:權限的認識和學習

目錄 一.shell命令以及運行原理 二.Linux權限的概念 1.Linux下兩種用戶 cannot open directory .: Permission denied 問題 2.Linux權限管理 1).是什么 2).為什么&#xff08;權限角色目標權限屬性&#xff09; 3).文件訪問者的分類&#xff08;角色&#xff09; 4).文…

【筆記】計算機網絡——數據鏈路層

概述 鏈路是從一個結點到相鄰結點的物理路線&#xff0c;數據鏈路則是在鏈路的基礎上增加了一些必要的硬件和軟件實現 數據鏈路層位于物理層和網絡層之間&#xff0c;它的核心任務是在直接相連的節點&#xff08;如相鄰的交換機&#xff0c;路由器&#xff09;之間提供可靠且…

ngx_url_t

定義在 src/core/ngx_inet.h typedef struct {ngx_str_t url;ngx_str_t host;ngx_str_t port_text;ngx_str_t uri;in_port_t port;in_port_t default_port;in_port_t …

搜廣推校招面經五十四

美團推薦算法 一、手撕Transformer的位置編碼 1.1. 位置編碼的作用 Transformer 模型沒有顯式的序列信息&#xff08;如 RNN 的循環結構&#xff09;&#xff0c;因此需要通過位置編碼&#xff08;Positional Encoding&#xff09;為輸入序列中的每個位置添加位置信息。位置…