MySQL事務瞭解

MySQL事務瞭解

​ 上次使用了最基本的MySQL,只是簡單的查詢一個表中的數據,這次練習一下事務。開始。

​ MySQL有四層架構,分別爲:連接層服務層引擎層存儲層。這四層的作用如下:

image-20200608233609217

​ 需要注意的是,事務的執行是在引擎層,並不是服務層。目前使用最廣泛的就是InnoDB,其他的引擎很少有支持事務的。

​ 事務的特性有四個。原子性一致性隔離性持久性。四個特性簡稱爲ACID,其含義和解釋如下:

  • 原子性:操作這些指令時,要麼全部執行成功,要麼全部不執行。只要其中一個指令執行失敗,所有的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。
  • 一致性:事務的執行使數據從一個狀態轉換爲另一個狀態,但是對於整個數據的完整性保持穩定。
  • 隔離性:隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
  • 持久性:當事務正確完成後,它對於數據的改變是永久性的。

​ MySQL中的事務爲了保證原子性,通過undo log日誌來進行事務的撤銷和數據的回滾。一致性則是MySQL中最終追求的目標,需要其他三個特性的支持。爲了保持隔離性,MySQL中使用鎖來對數據進行保護和同步。持久性則是使用InnoDB存儲引擎中的redo log日誌來實現的。下面分別介紹。

  • undo log 日誌。回滾日誌的作用就是對數據進行回滾,屬於邏輯日誌。它對SQL語句執行相關的信息進行記錄。當發生回滾時,InnoDB引擎會根據undo log日誌中的記錄做與之前相反的工作。比如對於每個數據插入操作(insert),回滾時會執行數據刪除操作(delete)。

  • 說鎖之前先說一下MySQL中的數據存儲形式,分爲:數據庫、數據表、數據頁、行。各個形式如下:

    image-20200612170140499

    MySQL中的鎖有下面幾種:行鎖、表鎖、頁鎖。粒度分別如下:

    • 行鎖:粒度最小的鎖,表示只針對當前操作的行進行加鎖;

    • 表鎖:粒度最大的鎖,表示當前的操作對整張表加鎖;

    • 頁鎖:粒度介於行級鎖和表級鎖中間的一種鎖,表示對頁進行加鎖;

    表鎖因爲鎖定的是整張表,所以併發性比較差,行鎖如果過多,佔用的資源比較多。

    涉及到鎖了,就要提及數據的讀寫問題了,讀寫問題有三類:髒讀、不可重複讀、幻讀。

    • 髒讀。當前事務中讀到其他事務未提交的數據,也就是髒數據。

      image-20200612202259136

    • 不可重複讀。在事務A中先後兩次讀取同一個數據,但是兩次讀取的結果不一樣。

      image-20200612202326662

    • 幻讀。在事務A中按照某個條件先後兩次查詢數據庫,兩次查詢結果的行數不同,這種現象稱爲幻讀。

      image-20200612202505995

    根據這些問題產生了四種隔離級別,如下圖:

    image-20200612202611299

    然後就是MVCC(多版本的併發控制協議)相當於git,這個可以解決髒讀和不可重複讀讀問題。這個放在後面講吧。

  • redo log日誌。重做日誌是InnoDB引擎層的日誌,用來記錄事務操作引起數據的變化,記錄的是數據頁的物理修改。InnoDB引擎對數據的更新,是先將更新記錄寫入redo log日誌,然後會在系統空閒的時候或者是按照設定的更新策略再將日誌中的內容更新到磁盤之中。這就是所謂的預寫式技術(Write Ahead logging)。這種技術可以大大減少IO操作的頻率,提升數據刷新的效率。redo log是一種物理日誌,記錄的是實際上對某個數據進行了怎麼樣的修改;而binlog是邏輯日誌,記錄的是SQL語句的原始邏輯,比如”給ID=2這一行的a字段加1 "。binlog日誌中的內容是二進制的,根據日記格式參數的不同,可能基於SQL語句、基於數據本身或者二者的混合。一般常用記錄的都是SQL語句。詳細執行步驟如下:(在對redo log寫入時有兩個階段的提交,一是binlog寫入之前prepare狀態的寫入,二是binlog寫入之後commit狀態的寫入。)

    image-20200612212946695

    其實是看了一篇博客,詳細了了解了事務的原理和關於MySQL的一些信息。鏈接如下:https://mp.weixin.qq.com/s/HQh_HpbtvJv6Y5k3OAlfsQ

    後面也回簡單寫一個demo,具體把這些概念瞭解一下。就這樣吧,結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章