成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL中的各種鎖把我搞糊涂啦~

數據庫 MySQL
mvcc里面最重要的莫過于ReadView了,它的存在保證了事務不可以讀取到未提交的事務所作的更改,避免了臟讀。

 [[387346]]

本文轉載自微信公眾號「java小杰要加油」,作者好懂事一男的 。轉載本文請聯系java小杰要加油公眾號。

話不多說,直接開車

事務并發訪問情況

讀-讀 情況

  • 并發事務讀取相同的數據,并不會對數據造成影響,允許并發讀

寫-寫 情況

  • 多事務并發寫寫時會發生臟寫的情況,不過任何一個事務隔離級別都不允許此情況發生,通過加鎖來杜絕臟寫

臟寫

  • 事務T1 將數據改成了A,但是還未提交,可此時事務T2又將數據改成了B,覆蓋了事務T1的更改,T1更新丟失,這種情況叫做臟寫

加鎖

  • 例如,現在事務T1,T2對這條記錄進行并發更改,剛才說是隔離級別是通過加鎖來杜絕此臟寫的,流程如下

 


這個鎖結構中有兩個比較關鍵的信息(其實還有很多信息,后面再聊)

 

 

  • trx信息:表示這個鎖結構是和哪個事務所關聯的
  • is_waiting信息:表示當前事務是否正在等待
  • 事務T1 將數據改成了A,但是還未提交,可此時事務T2又將數據改成了B,覆蓋了事務T1的更改,T1更新丟失,這種情況叫做臟寫

Q:能描述一下兩個事務并發修改同一條數據時,mysql這個鎖是怎么避免臟寫的嗎?

A :事務T1在更改這條數據前,就先內存中生成一把鎖與此數據相關聯(is_waiting為false,代表沒有等待),然后咔咔一頓操作更改數據,這個時候,事務T2來了,發現此記錄已經有一把鎖與之相關聯了(就是T1那一把鎖),然后就開始等待(is_waiting為true代表正在等待),事務T1更改完數據提交事務后,就會把此事務對應的所結構釋放掉,然后檢測一下還有沒有與此記錄相關聯的鎖,結果發現T2還在苦苦的等待,就把T2的鎖結構的(is_waiting為false,代表沒有等待)然后把T2事務對應的線程喚醒,T2獲取鎖成功繼續執行,總體流程如上。

讀-寫 /寫-讀 情況

在讀-寫 / 寫 -讀的情況下會出現臟讀,不可重復讀,幻讀的現象,不同的隔離級別可以避免不同的問題,具體相關內容可以看小杰的這篇文章 京東面試官問我:“聊聊MySql事務,MVCC?”

不過貼心的我還是列出來了 注:√代表可能發生,×代表不可能發生

隔離級別 臟讀 不可重復讀 幻讀
讀未提交(read uncommitted RU)
讀提交(read committed RC) ×
可重復讀(repeatable read RR) × ×
串行化(serializable ) × × ×

但是 RR在某些程度上避免了幻讀的發生

怎么避免臟讀、不可重復讀、幻讀這些現象呢?其實有兩種方案

  • 方案一 :讀操作使用MVCC,寫操作進行加鎖
    • mvcc里面最重要的莫過于ReadView了,它的存在保證了事務不可以讀取到未提交的事務所作的更改,避免了臟讀。
    • 在RC隔離級別下,每次select讀操作都會生成ReadView
    • 在RR隔離級別下,只有第一次select讀操作才會生成ReadView,之后的select讀操作都復用這一個ReadView

方案二:讀寫操作都用加鎖

某些業務場景不允許讀取舊記錄的值,每次讀取都要讀取最新的值。例如銀行取款事務中,先把余額讀取出來,再對余額進行操作。當這個事務在讀取余額時,不允許其他事務對此余額進行訪問讀取,直到取款事務結束后才可以訪問余額。所以在讀數據的時候也要加鎖

鎖分類

當使用讀寫都加鎖這個方案來避免并發事務寫-寫、讀-寫、寫-讀時而產生的臟讀,不可重復讀,幻讀現象時,那么這個鎖它就要做到,讀讀時不相互影響,上面三種情況時要相互阻塞,這時鎖也分了好幾類,我們繼續往下看

鎖定讀

  • 共享鎖(Shared Lock):簡稱S鎖,在事務要讀取一條記錄時,需要先獲取該記錄的S鎖
  • 獨占鎖(Exclusive Lock):簡稱X鎖,也稱排他鎖,在事務要改動一條記錄時,需要先獲取該記錄的X鎖

他們之間兼容關系如下 √代表可以兼容,×代表不可兼容

兼容性 S鎖 X鎖
S鎖 ×
X鎖 × ×

事務T1獲取某記錄的S鎖后,

  • 事務T2也可以獲取此記錄的S鎖,(兼容)
  • 事務T2不可以獲取此記錄的X鎖,直到T1提交后將S鎖釋放 (不兼容)

事務T1獲取某記錄的X鎖后,

  • 事務T2不可以獲取此記錄的S鎖,直到T1提交后將X鎖釋放 (不兼容)
  • 事務T2不可以獲取此記錄的X鎖,直到T1提交后將X鎖釋放 (不兼容)

鎖定讀語句

  1. SELECT .. LOCK IN SHARE MODE   # 對讀取的記錄添加S鎖 
  2.  
  3. SELECT .. FOR UPDATE # 對讀取的記錄添加X鎖 

多粒度鎖

前面提到的鎖都是針對記錄的,其實一個事務也可以在表級進行加鎖(S鎖、X鎖)

  • T1給表加了S鎖,那么
    • T2可以繼續獲取此表的S鎖
    • T2可以繼續獲取此表中的某些記錄的S鎖
    • T2不可以繼續獲取此表的X鎖
    • T2不可以繼續獲取此表中的某些記錄的X鎖
  • T1給表加了X鎖,那么
    • T2不可以繼續獲取此表的S鎖
    • T2不可以繼續獲取此表中的某些記錄的S鎖
    • T2不可以繼續獲取此表的X鎖
    • T2不可以繼續獲取此表中的某些記錄的X鎖

可是怎么可能平白無故的就給表加鎖呢,難道沒什么條件嗎?答案是肯定有條件的

  • 若想給表加S鎖,得先確保表中記錄沒有X鎖
  • 若想給表加X鎖,得先確保表中記錄沒有X鎖和S鎖

但是這個怎么確保呢?難道要一行一行的遍歷表中的所有數據嗎?當然不是啦,聰明的大佬們想出了下面這兩把鎖

  • 意向共享鎖(Intention Shared Lock):簡稱IS鎖,當事務準備在某記錄上加S鎖時,需要先在表級別加上一個IS鎖
  • 意向獨占鎖(Intention Exclusive Lock):簡稱IX鎖,當事務準備在某記錄上加X鎖時,需要先在表級別加上一個IX鎖

讓我們來看下加上這兩把鎖之后的效果是什么樣子的

  • 當想給記錄加S鎖時,先給表加一個IS鎖,然后再給記錄加S鎖

 

  • 當想給記錄加X鎖時,先給表加IX鎖,然后再給記錄加X鎖

 

然后 經過上面的操作之后

  • 如果想給表加S鎖,先看下表加沒加IX鎖,如果有的話,則表明此表中的記錄有X鎖,則需要等到IX鎖釋放掉后才可以加S鎖

 

  • 如果想給表加X鎖,先看下表加沒加IS鎖或者IX鎖,如果有的話,則表明此表中的記錄有S鎖或者X鎖,則需要等到IS鎖或者IX鎖釋放掉后才可以加X鎖

 

這幾種鎖的兼容性如下表

兼容性 IS鎖(表級鎖) S鎖 IX鎖(表級鎖) X鎖
IS鎖(表級鎖) ×
S鎖 × ×
IX鎖(表級鎖) × ×
X鎖 × × × ×
  • IS、IX鎖都是表級鎖,他們可以共存。
  • 他們的提出僅僅是為了在之后加表級別的S鎖或者X鎖時可以快速判斷表中的記錄是否被上鎖,避免用遍歷的方式來查看一行一行的去查看而已

InnoDB中的行級鎖

Record Lock(記錄鎖)

  • 官方名字 LOCK_REC_NOT_GAP
  • 僅僅鎖住一條記錄
  • 有S型和X型之分

Gap Lock(間隙鎖)

  • 官方名字 LOCK_GAP
  • 給某記錄加此鎖后,阻塞數據在此記錄和上一個記錄的間隙插入,但是不鎖定此記錄
  • 有S型和X型之分,可是并沒有什么區別他們的作用是相同的,gap鎖的作用僅僅是為了防止插入幻影記錄而已,如果對一條記錄加了gap鎖(無論S/X型)并不會限制其他事務對這條記錄加Record Lock或者Gap Lock

Next-Key Lock(記錄鎖+間隙鎖)

  • 官方名字 LOCK_ORDINARY
  • 既可以鎖住某條記錄,又可以組織其他事務在該記錄面前插入新記錄

Insert Intention Lock(插入意向鎖鎖)

  • 官方名字 LOCK_INSERT_INTENTION
  • 事務在插入記錄時,如果插入的地方加了gap鎖,那么此事務需要等待,此時此事務在等待時也需要生成一個鎖結構,就是插入意向鎖

鎖內存結構

  • 我們難道鎖一條記錄就要生成一個鎖結構嗎?

當然不是!

一個鎖結構

如果被加鎖的記錄符合下面四條狀態的話,那么這些記錄的鎖則會合到一個鎖結構中

  • 在同一個事務中進行加鎖操作
  • 被加鎖的記錄在同一個頁面中
  • 加鎖的類型是一樣的
  • 等待的狀態是一樣的

 

鎖結構信息

然后我們再來依此看下這個所結構每個部分的信息都是什么意思

 

  • 鎖所在的事務信息:無論是表級鎖還是行級鎖,一個鎖屬于一個事務,這里記載著該鎖對應的信息
  • 索引信息:對于行級鎖來說,需要記錄一下加鎖的記錄屬于哪個索引
  • 表鎖/行鎖信息:行級鎖
    • Space_ID:記錄所在的表空間 *** Page Number**:記錄所在的頁號
    • n_bits:一條記錄對應著一個比特;一個頁面包含多條記錄,用不同的比特來區分到底是那一條記錄加了鎖,有個計算公式如下(公式中是取商)n_bits = (1+(n_recs+LOCK_PAGE_BITMAP_MARGIN)/ 8)x 8LOCK_PAGE_BITMAP_MARGIN是固定的值為64,n_recs指當前界面一共有多少條記錄(包含偽記錄以及在垃圾鏈表中的記錄),
  • type_mode:32比特的數

 

  • lock_mode(鎖模式):低4比特位表示
    • LOCK_AUTO_INC(十進制的4):表示AUTO-INC鎖
    • LOCK_IS(十進制的0):表示共享意向鎖,IS鎖
    • LOCK_IX(十進制的1):表示獨占意向鎖,IX鎖
    • LOCK_S(十進制的2):表示共享鎖,也就是S鎖
    • LOCK_X(十進制的3):表示獨占鎖,也就是X鎖
  • lock_type(鎖類型):第5~8比特位表示
    • LOCK_TABLE(十進制的1):當第5比特位設置為1時,表示表級鎖
    • LOCK_REC(十進制的32):當第6比特位設置為1時,表示行級鎖
  • rec_lock_type(行鎖的具體類型):其余的比特位表示
    • 第9比特設置為1時,表示is_waiting為true,即當前事務獲取鎖失敗,處于等待狀態
    • 第9比特設置為0時,表示is_waiting為false,即當前事務獲取鎖成功
    • LOCK_ORDINARY(十進制的0):表示next-key鎖
    • LOCK_GAP(十進制的512):當第10比特位是1時,表示gap鎖
    • LOCK_REC_NOT_GAP(十進制的1024):也就是當第11比特設置為1時,表示Record Lock(記錄鎖)
    • LOCK_INSERT_INTENTION(十進制的2048):也就是當第12比特設置為1時,表示Insert Intention Lock(插入意向鎖)
    • LOCK_WAIT(十進制的256):也就是當
  • 其他信息:此文章不討論
  • 一堆比特位:此文章不討論

舉個例子

事務T1 要給user表中的記錄加鎖,假設這些記錄存儲在表空間號為20,頁號為21的頁面上,T1給id=1的記錄加S型Record Lock鎖,假如當前頁面一共有5條記錄(3條用戶記錄和2條偽記錄)

過程:先給表加IS鎖,不過我們現在不關心,只關心行級鎖, 具體生成的所結構如下圖所示


 

 原文鏈接:https://mp.weixin.qq.com/s/Ne7U2fsZRWD3L-MhRlTJew

 

責任編輯:武曉燕 來源: java小杰要加油
相關推薦

2020-06-22 17:44:35

MySQL表鎖

2021-11-26 09:53:55

MYSQL開發數據庫

2022-03-01 21:05:39

TCP網絡協議

2021-07-22 09:13:42

Java代碼

2015-07-20 11:32:07

編程語言

2021-12-03 11:57:27

代碼##語言

2019-09-23 15:49:49

Java悲觀鎖

2020-06-17 11:06:25

GitHub代碼開發者

2021-05-25 05:25:24

MySQL數據庫

2024-07-25 09:01:22

2025-02-10 09:58:48

2021-11-26 08:07:16

MySQL SQL 語句數據庫

2015-01-20 17:09:21

Android源碼手勢鎖

2017-05-02 13:38:51

CSS繪制形狀

2020-02-06 10:02:45

MySQL數據庫全局鎖

2021-02-07 07:40:31

Synchronize用法

2021-12-14 14:50:12

synchronizeJava

2012-05-03 09:56:31

招聘開發PHP

2017-05-10 10:54:06

編程CPU自旋鎖

2017-05-16 08:59:16

MVCCMYSQL樂觀鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久国产精品久久 | 免费视频二区 | 99亚洲| 国产精品91网站 | 国产农村一级片 | 97伊人 | 午夜精品一区二区三区在线视频 | 四虎永久免费地址 | 日韩精品一区在线 | 91久久久久久 | 一区二区三区在线观看视频 | 一级国产精品一级国产精品片 | 97国产在线观看 | 91精品久久久久 | 亚洲精品在线免费观看视频 | 欧美日韩精品久久久免费观看 | 精品国产一区二区三区久久久蜜月 | 亚洲一区av在线 | 日本不卡一区 | 中文字幕亚洲一区 | 精品国产一区二区三区av片 | 黄色网络在线观看 | 拍真实国产伦偷精品 | 四虎永久在线精品免费一区二 | 国产高清一区二区三区 | 国产欧美日韩精品在线观看 | 超碰伊人久久 | 中文字字幕在线中文乱码范文 | 精品一区二区三区四区视频 | 极品的亚洲| 97精品国产 | 精品视频久久久 | 久色一区 | 羞羞网站免费观看 | www.xxxx欧美 | av一级久久| 久久人人网 | av免费网站在线观看 | 罗宾被扒开腿做同人网站 | 91精品国产99 | 中文字幕一区二区三区四区 |