欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解MySQL事務的隔離級別與MVCC

 更新時間:2021年04月22日 10:21:58   作者:cool_wa  
這篇文章主要介紹了MySQL事務的隔離級別與MVCC的相關資料,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下

事務隔離級別

事務并發(fā)執(zhí)行遇到的問題

  • 臟寫
    • 如果一個事務修改了另一個未提交事務修改過的數(shù)據(jù),那就意味著發(fā)生了臟寫
  • 臟讀
    • 如果一個事務讀到了另一個未提交事務修改過的數(shù)據(jù),那就意味著發(fā)生了臟讀
  • 不可重復讀
    • 如果一個事務只能讀到另一個已經(jīng)提交的事務修改過的數(shù)據(jù),并且其他事務每對該數(shù)據(jù)進行一次修改并提交后,該事務都能查詢到最新值,那就意味著發(fā)生了不可重復讀
  • 幻讀
    • 如果一個事務先根據(jù)某些條件查詢出一些記錄,之后另一個事務又向表中插入了符合這些條件的記錄,原先的事務再次按照該條件查詢時,能把另一個事務插入的記錄也讀出來,那就意味著發(fā)生了幻讀。
    • 幻讀強調的是一個事務按照某個相同條件多次讀取記錄時,后讀取時讀到了之前沒有讀到的記錄
    • 那對于先前已經(jīng)讀到的記錄,之后又讀取不到這種情況,算啥呢?其實這相當于對每一條記錄都發(fā)生了不可重復讀的現(xiàn)象。幻讀只是重點強調了讀取到了之前讀取沒有獲取到的記錄。

SQL標準中的四種隔離級別

  • READ UNCOMMITTED: 未提交讀 臟讀、不可重復讀、幻讀 發(fā)生
  • READ COMMITTED:已提交讀 不可重復讀、幻讀 發(fā)生
  • REPEATBLE READ:可重復讀 幻讀 發(fā)生
  • SERIALIZABLE:可串行化 不發(fā)生

MySQL中支持的四種隔離級別

  • MySQL在REPEATABLE READ隔離級別下,是可以禁止幻讀問題的發(fā)生的(關于如何禁止我們之后會詳細說明的)
  • MySQL默認隔離級別為REPEATABLE READ

MVCC原理

版本鏈

對于使用InnoDB存儲引擎的表來說,它的聚簇索引記錄中都包含兩個必要的隱藏列

  • trx_id:每次一個事務對某條聚簇索引記錄進行改動時,都會把該事務的事務id賦值給trx_id隱藏列
  • roll_pointer:每次對某條聚簇索引記錄進行改動時,都會把舊的版本寫入到undo日志,然后這個隱藏列就相當于一個指針,可以通過它來找到該記錄修改前的信息。

ReadView

  • 對于使用READ UNCIMMITTED隔離級別的事務來說,由于可以讀到未提交事務修改過的記錄,所以直接讀取記錄的最新版本就好了;
  • 對于使用READ COMMITTED 和REPEATABLE READ 隔離級別的事務來說,都必須保證讀到已經(jīng)提交了的事務修改過的記錄,也就是說假如另一個事務已經(jīng)修改了記錄但是尚未提交,是不能直接讀取到最新版本記錄的。核心問題:需要判斷一下版本鏈中的哪個版本是當前事務可見的。為此設計了readview
  • readView包含4個比較重要的內(nèi)容:
    • m_ids:表示在生成ReadView時當前系統(tǒng)中活躍的讀寫事務的事務ID
    • min_trx_id:表示生成ReadView時當前系統(tǒng)中活躍的讀寫事務中最小的事務id,也就是m_ids中的最小值
    • max_trx_id: 表示生成ReadView時系統(tǒng)中應該分配給下一個事務的id值
    • creator_trx_id:表示生成該ReadView的事務的事務ID
      • 我們前邊說過,只有在對表中的記錄做改動時(執(zhí)行INSERT、DELETE、UPDATE這些語句時)才會為事務分配事務id,否則在一個只讀事務中的事務id值都默認為0。
  • 有了這個ReadView,這樣在訪問某條記錄時,只需要按照下邊的步驟判斷記錄的某個版本是否可見:
    • 如果被訪問的版本的trx_id屬性與ReadView中的creator_trx_id相同,意味著當前事務在訪問它自己修改過的記錄,所以該版本可以被當前事務訪問
    • 如果被訪問的trx_id屬性值小于ReadView中的min_trx_id值,表明生成該版本的事務在當前事務生成ReadView時已經(jīng)提交,所以該版本可以被當前事務訪問
    • 如果被訪問版本的trx_id屬性值大于或等于ReadView中的max_trx_id值,表明生成該版本的事務在當前事務生成ReadView后才開啟,所以該版本不可以被當前事務訪問
    • 如果被訪問版本的trx_id屬性值在ReadView的min_trx_id和max_trx_id之間,那就需要判斷一下trx_id屬性值是不是在m_ids列表中,如果在,說明創(chuàng)建ReadView時生成該版本的事務還是活躍的,該版本不可被訪問;如果不在,說明創(chuàng)建ReadView時生成該版本的事務已經(jīng)被提交,該版本可以被訪問。

總結一下:

  • READ COMMITTED隔離級別的事務在每次查詢開始時都會生成一個獨立的ReadView
  • REPEATABLE READ :在第一次讀取數(shù)據(jù)時生成一個ReadView,也就是說兩次SELECT 查詢得到的結果是重復的。

MVCC總結: 所謂的MVCC指的就是在使用 READ COMMITTED 和REPEATABLE READ 這兩種隔離級別的事務在執(zhí)行普通的SELECT 操作時訪問的記錄的版本鏈的過程,這樣子可以使不用的事務的讀-寫、寫-讀操作并發(fā)執(zhí)行,從而提升性能。

mysql如何在RR級別解決幻讀的

1.當前讀,讀的是最新版本,并且需要獲取對應記錄的鎖,如下SQL

  • select ... lock in share mode
  • select ... for update
  • update 、delete 、insert

是通過next-key 來實現(xiàn)幻讀的

2.快照讀 是通過mvcc 來解決的

以上就是詳解MySQL事務的隔離級別與MVCC的詳細內(nèi)容,更多關于MySQL事務的隔離級別與MVCC的資料請關注腳本之家其它相關文章!

相關文章

  • MySQL索引不會被用到的情況匯總

    MySQL索引不會被用到的情況匯總

    這篇文章主要給大家介紹了關于MySQL索引不會被用到的一些情況,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Windows中Mysql啟動失敗的完美解決方案

    Windows中Mysql啟動失敗的完美解決方案

    這篇文章主要介紹了Windows中Mysql啟動失敗解決方案,mysql服務啟動失敗分為2種情況給大家詳細介紹,針對每一種給大家詳細解決,需要的朋友可以參考下
    2022-10-10
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Mac系統(tǒng)下MySql下載MySQL5.7及詳細安裝圖解

    Mac系統(tǒng)下MySql下載MySQL5.7及詳細安裝圖解

    這篇文章主要介紹了Mac系統(tǒng)下MySql下載MySQL5.7及詳細安裝圖解,本文圖文并茂給大家介紹的非常詳細,需要的朋友可以參考下
    2017-11-11
  • MySQL查詢倒數(shù)第二條記錄實現(xiàn)方法

    MySQL查詢倒數(shù)第二條記錄實現(xiàn)方法

    這篇文章主要介紹了MySQL查詢倒數(shù)第二條記錄實現(xiàn)方法,本文直接給出代碼實例,重要部分已經(jīng)加紅提示,需要的朋友可以參考下
    2015-05-05
  • mysql 5.6 從陌生到熟練之_數(shù)據(jù)庫備份恢復的實現(xiàn)方法

    mysql 5.6 從陌生到熟練之_數(shù)據(jù)庫備份恢復的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猰ysql 5.6 從陌生到熟練之_數(shù)據(jù)庫備份恢復的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • MySQL中常見的八種SQL錯誤用法示例

    MySQL中常見的八種SQL錯誤用法示例

    這篇文章主要給大家介紹了關于MySQL中常見的八種SQL錯誤用法示例的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • 詳解MySQL主鍵唯一鍵重復插入解決方法

    詳解MySQL主鍵唯一鍵重復插入解決方法

    我們插入數(shù)據(jù)的時候,有可能碰到重復數(shù)據(jù)插入的問題,那么MySQL主鍵唯一鍵重復插入如何解決,本文就詳細的來介紹一下,感興趣的可以了解一下
    2021-09-09
  • MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法詳解

    MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法詳解

    這篇文章主要介紹了MySQL創(chuàng)建和刪除數(shù)據(jù)表的命令及語法,是MySQL入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • 分享幾道關于MySQL索引的重點面試題

    分享幾道關于MySQL索引的重點面試題

    這篇文章主要給大家介紹了幾道關于MySQL索引的重點面試題,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05

最新評論