柚子快報激活碼778899分享:數(shù)據(jù)庫 SQL中的鎖
柚子快報激活碼778899分享:數(shù)據(jù)庫 SQL中的鎖
一、概述
介紹
鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的機制。在數(shù)據(jù)庫中,除傳統(tǒng)的計算資(CPU、RAM、I/0)的爭用以外,數(shù)據(jù)也是一種供許多用戶共享的資源。如何保證數(shù)據(jù)并發(fā)訪問的一致性、有效性是所有數(shù)據(jù)庫必須解決的一個問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個重要因素。從這個角度來說,鎖對數(shù)據(jù)庫而言顯得尤其重要,也更加復雜。
分類
MySOL中的鎖,按照鎖的粒度分,分為以下三類: 1. 全局鎖:鎖定數(shù)據(jù)庫中的所有表。 2. 表級鎖:每次操作鎖住整張表。 3. 行級鎖:每次操作鎖住對應的行數(shù)據(jù)。
二、全局鎖
介紹
全局鎖就是對整個數(shù)據(jù)庫實例加鎖,加鎖后整個實例就處于只讀狀態(tài),后續(xù)的DML的寫語句,DDL語句,已經(jīng)更新操作的事務提交語句都將被阻塞。 其典型的使用場景是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性視圖,保證數(shù)據(jù)的完整性。
加上全局鎖:
特點
數(shù)據(jù)庫中加全局鎖,是一個比較重的操作,存在以下問題: 1.如果在主庫上備份,那么在備份期間都不能執(zhí)行更新,業(yè)務基本上就得停擺。
2.如果在從庫上備份,那么在備份期間從庫不能執(zhí)行主庫同步過來的二進制日志(binlog)會導致主從延遲。
在InnoDB引擎中,我們可以在備份時加上參數(shù) --single-transaction 參數(shù)來完成不加鎖的一致性數(shù)據(jù)備份。
三、表級鎖
表級鎖,每次操作鎖住整張表。鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。應用在MyISAM、InnODB、BDB等存儲引擎中。
對于表級鎖,主要分為以下三類: 1. ?表鎖 2. 元數(shù)據(jù)鎖(meta data lock,MDL) 3. 意向鎖
表鎖
1. 表共享讀鎖(read lock)
不會阻塞讀,但會阻塞其他客戶端的寫:
2. 表獨占寫鎖(write lock)
能讀也能寫,但會阻塞其他客戶端的讀和寫:
語法:
1. 加鎖:lock tables 表名... read/write。 2. 釋放鎖:unlock tables / 客戶端斷開連接。
元數(shù)據(jù)鎖(MDL)
MDL加鎖過程是系統(tǒng)自動控制,無需顯式使用,在訪問一張表的時候會自動加上。MDL鎖主要作用是維護表元數(shù)據(jù)的數(shù)據(jù)一致性,在表上有活動事務的時候,不可以對元數(shù)據(jù)進行寫入操作。為了避免DML與DDL沖突,保證讀寫的正確性。
在MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);當對表結構進行變更操作的時候,加MDL寫鎖(排他)。
查看元數(shù)據(jù)鎖:
意向鎖
為了避免DML在執(zhí)行時,加的行鎖與表鎖的沖突,在lnnoDB中引入了意向鎖,使得表鎖不用檢查每行數(shù)據(jù)是否加鎖,使用意向鎖來減少表鎖的檢查。
1.意向共享鎖(IS):由語句 select..lock in share mode添加。與表鎖共享鎖(read)兼容,與表鎖排它鎖(write)互斥。 2.意向排他鎖(IX):由insert、update、delete、select ...for update 添加。與表鎖共享鎖(read)及排它鎖(write)都互斥。意向鎖之間不會互斥。
可以通過以下SQL,查看意向鎖及行鎖的加鎖情況:
四、行級鎖
介紹
行級鎖,每次操作鎖住對應的行數(shù)據(jù)。鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度最高。應用在InnoDB存儲引擎中。
InnoDB的數(shù)據(jù)是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現(xiàn)的,而不是對記錄加的鎖。對于行級鎖,主要分為以下三類:
1. 行鎖(Record Lock):鎖定單個行記錄的鎖,防止其他事務對此行進行update和delete。在RC、RR隔離級別下都支持。
2. 間隙鎖(GapLock):鎖定索引記錄間隙(不含該記錄),確保索引記錄間隙不變,防止其他事務在這個間隙進行insert,產(chǎn)生幻讀。在RR隔離級別下都支持。
3.?臨鍵鎖(Next-Key Lock):行鎖和間隙鎖組合,同時鎖住數(shù)據(jù),并鎖住數(shù)據(jù)前面的間隙Gap。在RR隔離級別下支持。
行鎖
InnoDB實現(xiàn)了以下兩種類型的行鎖: 1. 共享鎖(S):允許一個事務去讀一行,阻止其他事務獲得相同數(shù)據(jù)集的排它鎖。 2. 排他鎖(X):允許獲取排他鎖的事務更新數(shù)據(jù),阻止其他事務獲得相同數(shù)據(jù)集的共享鎖和排他鎖。
可以通過以下SQL,查看意向鎖以及行鎖的加鎖情況:
間隙鎖、臨鍵鎖
默認情況下,InnoDB在 REPEATABLE READ事務隔離級別運行,InnoDB使用 next-key 鎖進行搜索和索引掃描,以防止幻讀。 1. 索引上的等值查詢(唯一索引),給不存在的記錄加鎖時,優(yōu)化為間隙鎖。 2. 索引上的等值查詢(普通索引),向右遍歷時最后一個值不滿足查詢需求時,next-key lock 退化為間隙鎖。 3. 索引上的范圍查詢(唯一索引)--會訪問到不滿足條件的第一個值為止。
注意:間隙鎖唯一目的是防止其他事務插入間隙。間隙鎖可以共存,一個事務采用的間隙鎖不會阻止另一個事務在同一間隙上采用間隙鎖。
柚子快報激活碼778899分享:數(shù)據(jù)庫 SQL中的鎖
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。