99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

MySQL中的鎖,全局鎖、表級鎖、行級鎖-創新互聯

全局鎖 特點

數據庫中加全局鎖,是一個比較重的操作,執行全局鎖時會鎖住整個數據庫,同時存在以下問題:

為綏德等地區用戶提供了全套網頁設計制作服務,及綏德網站建設行業解決方案。主營業務為成都網站制作、網站設計、綏德網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
  1. 如果在主庫上備份,那么備份期間都不能執行更新操作,業務基本上就得停擺。
  2. 如果在從庫上備份,那么備份期間從庫不能執行主庫同步過來的二進制日志(binlog),會導致主從延遲。

在InnoDB引擎中,我們可以在備份是加上參數--single-transaction參數來完成不加鎖的一次性數據備份。

表級鎖

表級鎖,每次操作鎖住整張表,鎖定粒度大,發生鎖沖突的概率最高,并發度最低,應用在MyISAM、InnoDB、BDB等存儲引擎中。

表級鎖又主要分為以下三類:

  • 表鎖
  • 元數據鎖(meta data lock,MDL)
  • 意向鎖
1.表鎖

表鎖又分為兩類:

  1. 表共享鎖/讀鎖(read lock)
  2. 表獨占寫鎖(write lock)

相關語法:

  • 加鎖:lock tables 表名... read/write。
  • 釋放鎖:unlock table / 客戶端斷開連接。
讀鎖(read lock)是什么?

當客戶端A對表1上了讀鎖之后,哪怕是客戶端A,也無法再對表1進行除了讀以外的操作,比如說增刪改,此時如果其他客戶端也來操作表1,也是只能執行讀取操作,只有當客戶端A釋放了鎖,才能進行其他操作。

寫鎖(write lock)是什么?

當客戶端A對表1上了寫鎖之后,只有客戶端A可以對表1進行增刪改查操作,而此時其他客戶端要想來操作表1進行增刪改查,都會進入阻塞狀態,只有當客戶端A釋放了鎖,操作才會恢復正常。

2.元數據鎖(meta data lock,MDL)

MDL加鎖過程是系統自動控制,無需顯式使用(即不需要通過lock等關鍵字手動加鎖),在訪問一張表的時候會自動加上。MDL鎖主要作用是維護表元數據(元數據大概指的就是表結構)的數據一致性,在表上有活動事務的時候,不可以對元數據進行寫入操作。為了避免DML與DDL沖突,保證讀寫的正確性。

MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);當對表結構進行變更操作的時候,加MDL寫鎖(排他)。

3.意向鎖

意向鎖又分為兩類:

  1. 意向共享鎖(IS):與表鎖共享鎖/讀鎖(read lock)兼容,與表排它鎖/寫鎖(write lock)互斥。
  2. 意向排它鎖(IX):與表共享鎖以及排它鎖都互斥,而意向鎖之間不會互斥。

可以通過一下SQL來查詢意向鎖以及行鎖的加鎖情況:

舉一個場景例子,如下圖所示,在不引用意向鎖的情況下,當線程A開啟事務之后,對id為3的記錄執行updata操作,在InnoDB引擎下會默認對該記錄賦上行鎖,此時有一個線程B嘗試對該表設置表鎖,線程B是需要一行一行地檢查整張表來判斷哪一行被上了表鎖,這樣非常影響性能。

當引入了意向鎖的概念之后,當線程A開啟事務之后,對id為3的記錄執行updata操作,在InnoDB引擎下會默認對該記錄賦上行鎖,并同時為整張表賦上意向鎖。此時線程B要想給該表設置全局鎖,它會去檢查這張表意向鎖的情況,通過意向鎖的情況來決定它能不能給這張表設置表鎖,如果意向鎖和線程B所要加的鎖是兼容的,那么可以正常加鎖,如果不兼容,則線程B會進入阻塞狀態,直到線程A提交完事務釋放鎖線程B才會退出阻塞。

行級鎖 1.行鎖

行級鎖,每次操作鎖住對應的行數據。鎖定力度最小,發生鎖沖突的概率最低,并發度最高。應用在InnoDB存儲引擎中。

InnoDB的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對數據記錄加的鎖,主要分為以下三類:?

  • 行鎖(Record Lock):鎖定單個行記錄的鎖,防止其他事務對此進行updata和delete。在RC(Read Committed)、RR(Repeatable Read)隔離級別下都支持
  • 間隙鎖(Grap Lock):鎖定索引記錄間隙(但是不包括該記錄),確保索引記錄間隙不變,防止其他事務在這個間隙進行insert,產生幻讀,在RR(Repeatable Read)隔離級別下都支持
  • 鄰鍵鎖(Next-Key Lock):行鎖和間隙鎖組合,同時鎖住數據,并鎖住數據前面的間隙Gap,在RR(Repeatable Read)隔離級別下支持

其中InnoDB實現了以下兩種類型的行鎖:

  1. 共享鎖(S):允許一個事務去讀一行,阻止其他事務獲得其他相同數據集的排它鎖。共享鎖和共享鎖之間是兼容的,但共享鎖和排它鎖之間是互斥的。
  2. 排它鎖(X):允許獲取排它鎖的事務更新數據,阻止其他事務獲得相同數據集的共享鎖和排它鎖

2.間隙鎖/鄰鍵鎖?

1.對于圖中第一點,我們可以來舉個例子,假設一張表中的主鍵id數據有1,2,3,8,11,16,當一個服務器A對id為5的記錄進行updata操作時,因為表中沒有id為5的數據行記錄,那么就會有一個間隙鎖鎖在id為8之前,即間隙鎖的范圍是3-8,此時我們如果想要在服務器B對間隙中插入一條數據,譬如一條id為7的數據行,是會進入阻塞狀態的,該阻塞狀態會直到服務器A的事務提交完畢才結束。(間隙鎖唯一目的是防止其他事務插入間隙。間隙鎖可以多個共存,一個事務采用的間隙鎖不會組織另一個事務在同一間隙上采用間隙鎖,大致意思就是一個間隙是可以被多個事務疊加上間隙鎖)

2.對于圖中的第二點,我們可以接著來舉一個例子,如下圖,如果說我們要對非主鍵的字段18來進行等值查詢(譬如where age = 18)時,InnoDB會在16到18的這間隙中加一個鎖,同時給18本身加上鄰鍵鎖,還會給18到29這一間隙加上鎖(這句話就是上圖第二點中后面那兩句話,當向右遍歷的時候,只要那一個值不是你要查的數值18,那就會把鄰鍵鎖退化成間隙鎖,當向右查到的數據依舊包含不止一個18,那么查出來的所有18都會被加上鄰鍵鎖),因為其他服務器有可能會在16-18以及18-29之間再插入數據,而且還有可能插入的數據也是18,因為這并不是唯一索引。

另外,如果我們要使用范圍查詢,比如說要執行一條查詢語句的條件為age >=67,那么此時被上鎖的情況如下:

間隙鎖:(67,87)、(87,90)、(90,92)、(92,94)、(94,98)、(98,正無窮)

行鎖:67、87、90、92、94、98

本篇文章僅作為學習筆記,供大家復習或者參考,學習源來自于B站黑馬程序員下的MySQL數據庫教程74. 進階-鎖-行級鎖-間隙鎖&臨鍵鎖2_嗶哩嗶哩_bilibili


你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

網站欄目:MySQL中的鎖,全局鎖、表級鎖、行級鎖-創新互聯
瀏覽路徑:http://www.yijiale78.com/article46/pijhg.html

成都網站建設公司_創新互聯,為您提供建站公司網站內鏈虛擬主機網站改版微信公眾號動態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設