MySQL事務以及隔離級別

来源:https://www.cnblogs.com/wenbochang/archive/2018/03/15/8536929.html
-Advertisement-
Play Games

前言: 我一直想不到一個好的標題應該怎麼寫。我想MySQL的一些重要的內容。我在兩次面試中都遇到過的,但直接用MySQL標題好像又不太貼切。乾脆就是所寫的內容吧。 MySQL事務: transaction Transactions are atomic units of work that can ...


前言:

我一直想不到一個好的標題應該怎麼寫。我想MySQL的一些重要的內容。我在兩次面試中都遇到過的,但直接用MySQL標題好像又不太貼切。乾脆就是所寫的內容吧。

MySQL事務:

transaction

Transactions are atomic units of work that can be committed or rolled back. When a transaction makes multiple changes to the database, either all the changes succeed when the transaction is committed, or all the changes are undone when the transaction is rolled back.

Database transactions, as implemented by InnoDB, have properties that are collectively known by the acronym ACID, for atomicity, consistency, isolation, and durability.

See Also ACIDcommitisolation levellockrollback.

MySQL官網對事務的解釋。(提醒還在大一大二的師弟師妹,學號英語真的很重要,很重要,超級重要)

A(atomicity)原子性:   即事務要麼全部做完,要麼全部不做,不會出現只做一部分的情形,如A給B轉帳,不會出現A的錢少了,B的錢卻沒有增加的情況 C(consistency)一致性:   指的是事務從一個狀態到另一個狀態是一致的,如A減少了100,B不可能只增加30。 I(isolation)隔離性:   即一個事務在沒有完成數據的提交修改時,對其它事務是不可見的。當然這裡有個隔離級別的概念,在不同隔離級別下,這裡會有不同的表現形式 D(durability)持久性:   一旦事務提交,則所做修改就會被永久保存到資料庫中。  

四種隔離級別:

isolation level

One of the foundations of database processing. Isolation is the I in the acronym ACID; the isolation level is the setting that fine-tunes the balance between performance and reliability, consistency, and reproducibility of results when multiple transactions are making changes and performing queries at the same time.

From highest amount of consistency and protection to the least, the isolation levels supported by InnoDB are: SERIALIZABLE, REPEATABLE READ, READ COMMITTED, and READ UNCOMMITTED.

With InnoDB tables, many users can keep the default isolation level (REPEATABLE READ) for all operations. Expert users might choose the READ COMMITTED level as they push the boundaries of scalability with OLTP processing, or during data warehousing operations where minor inconsistencies do not affect the aggregate results of large amounts of data. The levels on the edges (SERIALIZABLE and READ UNCOMMITTED) change the processing behavior to such an extent that they are rarely used.

See Also ACIDOLTPREAD COMMITTEDREAD UNCOMMITTEDREPEATABLE READSERIALIZABLEtransaction.

Read Uncommitted(讀取未提交內容)

       在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read)。
Read Committed(讀取提交內容)

       這是大多數資料庫系統的預設隔離級別(但不是MySQL預設的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重覆讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果。
Repeatable Read(可重讀)

       這是MySQL的預設事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。

Serializable(可串列化) 
       這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共用鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

我這裡解釋一下 “讀寫提交內容” 和 “可重讀” 的區別。

假設有兩個事務 T1, T2

讀寫提交內容:

  T1 insert了一條數據,T2此時看不到,等T1commit了以後,T2才看到了。這就造成了T2前後兩次select的內容不一致,也就造成了不可重讀的原因。

可重讀:

  T1 insert了一條數據,T2此時看不到,等T1 commit了以後,T2還是看不到。等T2事務進行提交了以後,在進行select,發覺,卧槽,數據怎麼多了一條出來,感覺出現了幻覺,即“幻讀”;

MVCC機制:

多版本併發控制(Multiversion Concurrency Control)。MySQL預設隔離級別為Repeatable Read(可重讀)。那麼MySQL如何解決幻讀的。

就是利用MVCC機制。

什麼是多版本併發控制呢 ?其實就是在每一行記錄的後面增加兩個隱藏列,記錄創建版本號和刪除版本號,

而每一個事務在啟動的時候,都有一個唯一的遞增的版本號。

只有read-committed和 repeatable-read 兩種事務隔離級別才能使用MVCC

read-uncommited由於是讀到未提交的,所以不存在版本的問題

而serializable 則會對所有讀取的行加鎖。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註: 1.本文安裝的是jdk1.8,採用rpm包的方式安裝。 2.rpm安裝方式預設會把jdk安裝到/usr/java/jdk1.8xxx 路徑上,若想將JDK安裝到特定路徑,需以源碼方式安裝。 步驟: 1.官網下載JDK1.8的rpm文件,並上傳到linux伺服器(任意目錄) 2.使用rpm命令安 ...
  • Jenkins安裝及配置 目錄 1、安裝java. 2 1.1安裝說明... 2 1.2創建java目錄... 2 1.3下載並解壓... 2 1.4設置環境變數... 2 1.5驗證JDK有效性... 3 2、安裝Git. 3 2.1安裝GCC軟體套件... 3 2.2下載安裝Git. 4 3、安 ...
  • ——參考文獻: "RedHat Linux RPM packages for Jenkins" ...
  • 下麵是利用 man yum.conf 命令獲取到的有關yum配置的說明: yum.conf(5) yum configuration file yum.conf(5) NAME yum.conf - Configuration file for yum(8). DESCRIPTION Yum 使用到 ...
  • Linux添加硬碟擴充已有分區存儲空間方式 總體步驟 磁碟初始化分區 創建物理捲 擴展卷組 擴展邏輯捲 通知文件系統生效 ​ 磁碟初始化分區 已有磁碟200G,添加一塊1T的磁碟 執行結果 第二塊磁碟分區已經創建,分配空間1T(全部空間) 創建物理捲 現有物理捲如下: [root@oracledb ...
  • 1.打開MySQL目錄下的my.ini文件,在文件的最後添加一行“skip-grant-tables”,保存並關閉文件; 2.重啟MySQL服務; 3.通過cmd行進入MySQL的bin目錄,輸入“mysql -u root -p”(不輸入密碼),回車即可進入資料庫; 4.執行“use mysql; ...
  • 一、材料準備: oracle11g安裝包(64位) oracle11g客戶端(32位) PL\SQL Developer安裝包(32位) oracle11g安裝包(64位) oracle11g客戶端(32位) PL\SQL Developer安裝包(32位) 1、下載Oracle 11g鏈接:htt ...
  • 個人博客: "這可能是最好的SQL入門教程" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...