最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

你需要理解的關于MySQL的鎖知識

 更新時間:2019年05月20日 11:32:30   作者:木木匠  
鎖是MySQL里面最難理解的知識,但是又無處不在。一開始接觸鎖的時候,感覺被各種鎖類型和名詞弄得暈頭轉向,下面小編來簡單介紹一下

一、前言

MySQL 的鎖按照范圍可以分為全局鎖、表鎖、行鎖,其中行鎖是由數(shù)據(jù)庫引擎實現(xiàn)的,并不是所有的引擎都提供行鎖,MyISAM 就不支持行鎖,所以文章介紹行鎖會以InnoDB引擎為例來介紹行鎖。

二、全局鎖

MySQL 提供全局鎖來對整個數(shù)據(jù)庫實例加鎖。

語法:

FLUSH TABLES WITH READ LOCK

這條語句一般都是用來備份的,當執(zhí)行這條語句后,數(shù)據(jù)庫所有打開的表都會被關閉,并且使用全局讀鎖鎖定數(shù)據(jù)庫的所有表,同時,其他線程的更新語句(增刪改),數(shù)據(jù)定義語句(建表,修改表結構)和更新類的事務提交都會被阻塞。

在mysql 8.0 以后,對于備份,mysql可以直接使用備份鎖。

語句:

LOCK INSTANCE FOR BACKUPUNLOCK INSTANCE

這個鎖的作用范圍更廣,這個鎖會阻止文件的創(chuàng)建,重命名,刪除,包括 REPAIR TABLE TRUNCATE TABLE, OPTIMIZE TABLE操作以及賬戶的管理都會被阻塞。當然這些操作對于內(nèi)存臨時表來說是可以執(zhí)行的,為什么內(nèi)存表不受這些限制呢?因為內(nèi)存表不需要備份,所以也就沒必要滿足這些條件。

三、表鎖

Mysql的表級別鎖分為兩類,一類是元數(shù)據(jù)鎖(Metadata Lock,MDL),一種是表鎖。

元數(shù)據(jù)鎖(MDL) 不需要顯式使用,在訪問一個表的時候會被自動加上。這個特性需要MySQL5.5版本以上才會支持,當對一個表做增刪改查的時候,該表會被加MDL讀鎖;當對表做結構變更的時候,加MDL寫鎖。MDL鎖有一些規(guī)則:

讀鎖之間不互斥,所以可以多線程多同一張表進行增刪改查。讀寫鎖、寫鎖之間是互斥的,為了保證表結構變更的安全性,所以如果要多線程對同一個表加字段等表結構操作,就會變成串行化,需要進行鎖等待。MDL的寫鎖優(yōu)先級比MDL讀鎖的優(yōu)先級,但是可以設置max_write_lock_count系統(tǒng)變量來改變這種情況,當寫鎖請求超過這個變量設置的數(shù)后,MDL讀鎖的優(yōu)先級會比MDL寫鎖的優(yōu)先級高。(默認情況下,這個數(shù)字會很大,所以不用擔心寫鎖的優(yōu)先級下降)MDL的鎖釋放必須要等到事務結束才會釋放。

所以我們在操作數(shù)據(jù)庫表結構時候必須要注意不要使用長事務,這里具體是什么意思呢?我舉個例子說明下:

上圖表示演示了4個session執(zhí)行語句,首先SessionA開啟了事務沒有提交,接著sessionB執(zhí)行查詢,因為是獲取MDL讀鎖,所以互相不影響,可以正常執(zhí)行,SessionC新增一個字段,由于MDL寫和讀是互斥的,所以SessionC會被阻塞,之后SessionD開始執(zhí)行一個查詢語句,由于SessionC的阻塞,所以SessionD也阻塞了。所以,我們模擬的SessionA的事務是長事務,然后后面執(zhí)行了修改表結構,會導致后續(xù)對該表所有的讀寫操作都不可行了。所以在實際場景中,如果業(yè)務請求比較頻繁的時候,對表結構進行修改的時候就有可能導致該庫的線程被阻塞滿。

表鎖 的語法如下:

LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ...lock_type: { READ [LOCAL] | [LOW_PRIORITY] WRITE}UNLOCK TABLES

表鎖分為讀鎖和寫鎖,讀鎖不互斥,但是獲取讀鎖不能寫入數(shù)據(jù),其他沒有獲取到讀鎖的session也是可以讀取表的,所以讀鎖的目的就是限制表被寫。如果表被讀鎖鎖住后,再執(zhí)行插入語句會報錯,報錯如下:

1099 - Table 'XXXX' was locked with a READ lock and can't be updated

寫鎖被獲取后可以對表進行讀寫,寫鎖是互斥的,一旦某個session獲取到表的寫鎖,另外的session無法訪問這個表,直到寫鎖被釋放。

表的解鎖可以使用unlock tables解鎖,也可以客戶端口自動解鎖。lock tables鎖表會獨占式的鎖住表,除了限制其他線程對該表的讀寫,也會限制本線程接下來的操作對象。

四、行鎖(InnoDB)

MySQL的行鎖是在引擎層面實現(xiàn)的,所以這里討論的也是InnoDB引擎下的行鎖,下面會詳細介紹InnoDB下常見的幾種行鎖

4.1 共享鎖

共享鎖能允許事務獲取到鎖后進行讀操作,共享鎖是不互斥的,一個事務獲取到共享鎖后,另外一個事務也可以獲取共享鎖,獲取共享鎖后不能進行寫操作。

4.2 排它鎖

排他鎖允許事務獲取到鎖后進行更新一行或者刪除某一行操作,排他鎖顧名思義是互斥的,一個事務獲取到排他鎖后,其他事務不能獲取到排他鎖,直到這個鎖被釋放。

4.3 意向鎖

InnoDB支持多種粒度的鎖,允許行鎖和表鎖共存,這里說的意向鎖其實是一種表級別的鎖,但是我把它放在行鎖里面是因為它不會單獨存在,它的出現(xiàn)肯定會伴隨著行鎖(共享鎖或者排他鎖),它主要的目的就是表示將要鎖定表中的行或者正在鎖定表中的行。

意向鎖根據(jù)和行鎖的組合可以分為:

  • 意向排他鎖:表明將要在表中的某些行獲取排他鎖
  • 意向共享鎖:表明將要在表中的某些行獲取共享鎖

意向鎖的獲取必須在行鎖獲取之前,也就是說獲取共享鎖之前必須先要獲取共享意向鎖,對于排他鎖也是一樣的道理。

那么這個意向鎖到底有什么作用呢?

解釋這個之前,我們先看看意向鎖和行鎖之前的兼容關系:

--- 排他鎖(X) 意向排他鎖(IX) 共享鎖(S) 意向共享鎖(IS)
排他鎖(X) 沖突 沖突 沖突 沖突
意向排他鎖(IX) 沖突 兼容 沖突 兼容
共享鎖(S) 沖突 沖突 兼容 兼容
意向共享鎖(IS) 沖突 兼容 兼容 兼容

我們假設有2個事務A和事務B,事務獲取到了共享鎖,鎖住了表中的某一行,這一行只能讀,不能寫,現(xiàn)在事務B要申請整個表的寫鎖。如果事務B申請成功,那么肯定是可以對表中所有的行進行寫操作的,那么肯定與A獲取的行鎖沖突。數(shù)據(jù)庫為了避免這種沖突,就會進行沖突檢測,那么如何去檢測呢?有兩種方式:

判斷表是否已經(jīng)被其他事務用表級鎖鎖住。判斷表中的每一行是否被行鎖鎖住。

判斷表中的每一行需要遍歷所有記錄,效率太差,所以數(shù)據(jù)庫就用第一種方式去做沖突檢測,也就是用到了意向鎖。

總結

本文主要從MySQL的加鎖范圍來分析了MySQL的鎖,MySQL根據(jù)加鎖范圍可以分為全局鎖、表鎖、行鎖。全局鎖和表鎖是MySQL自己實現(xiàn),行鎖都是由引擎層面去實現(xiàn)。InnoDB下的行鎖主要分為共享鎖和排他鎖。共享鎖請求后,行只能讀,共享鎖之間不互斥。排他鎖獲取后能更新和刪除行,排他鎖與其他鎖都互斥。最后我在行鎖的基礎上提到了意向鎖,意向鎖主要表示正在鎖住行或者即將鎖住行,為了在鎖沖突檢測中提高效率。當然InnoDB下還有其他鎖,比如間隙鎖,記錄鎖,Next-Key鎖等,這些都不在本文的探討范圍之內(nèi),如有興趣的同學可以自行研究。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MySQL中的驅動表與被驅動表及含義

    MySQL中的驅動表與被驅動表及含義

    使用join連接查詢時如果有where條件,則MySQL執(zhí)行器會根據(jù)查詢條件過濾后的結果自動選擇驅動表或被驅動表,這篇文章主要介紹了MySQL的驅動表與被驅動表,需要的朋友可以參考下
    2023-10-10
  • session 加入mysql庫的方法

    session 加入mysql庫的方法

    本篇文章主要介紹了 session 加入mysql的方法,大家在開發(fā)過程中會遇到對數(shù)據(jù)庫的操作,有時會遇到Session加入mysql,這里給大家提供了方法,
    2016-07-07
  • 詳解MySQL性能優(yōu)化(二)

    詳解MySQL性能優(yōu)化(二)

    本文對MySQL性能優(yōu)化進行了詳細的總結與介紹,需要的朋友可以參考下
    2015-08-08
  • MySQL數(shù)據(jù)庫誤刪回滾的解決

    MySQL數(shù)據(jù)庫誤刪回滾的解決

    本文主要介紹了MySQL數(shù)據(jù)庫誤刪回滾的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 后端服務器中如何實現(xiàn)MySQL數(shù)據(jù)庫操作接口

    后端服務器中如何實現(xiàn)MySQL數(shù)據(jù)庫操作接口

    文章主要介紹了如何在Node.js中使用mysql模塊連接MySQL數(shù)據(jù)庫,并通過Express框架實現(xiàn)數(shù)據(jù)庫操作接口,前端可以通過Axios庫與后端進行交互,實現(xiàn)數(shù)據(jù)操作
    2024-11-11
  • MySQL中刪除重復數(shù)據(jù)的簡單方法

    MySQL中刪除重復數(shù)據(jù)的簡單方法

    這篇文章主要介紹了MySQL中刪除重復數(shù)據(jù)的簡單方法,比起一般的NOT IN語句的效率更為高,需要的朋友可以參考下
    2015-05-05
  • MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結構詳解

    MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結構詳解

    這篇文章主要為大家詳細介紹了MySQL的InnoDB存儲引擎的數(shù)據(jù)頁結構,,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • MySQL數(shù)據(jù)庫分組查詢group by語句詳解

    MySQL數(shù)據(jù)庫分組查詢group by語句詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫分組查詢group by語句詳解,文中含有詳細示例代碼說明解析,有需要的朋友可以借鑒參考想=下,希望能夠有所幫助
    2021-09-09
  • 關于join?on和where執(zhí)行順序分析

    關于join?on和where執(zhí)行順序分析

    這篇文章主要介紹了join?on和where執(zhí)行順序,如果是inner?join,?放on和放where產(chǎn)生的結果一樣,?執(zhí)行計劃也是一樣,但推薦使用on,本文對join?on和where執(zhí)行順序給大家詳細講解,需要的朋友可以參考下
    2023-03-03
  • mysql千萬級數(shù)據(jù)大表該如何優(yōu)化?

    mysql千萬級數(shù)據(jù)大表該如何優(yōu)化?

    如何設計或優(yōu)化千萬級別的大表?此外無其他信息,個人覺得這個話題有點范,就只好簡單說下該如何做,對于一個存儲設計,必須考慮業(yè)務特點,收集的信息如下
    2011-08-08

最新評論

洛隆县| 靖宇县| 盐亭县| 嘉峪关市| 息烽县| 古交市| 昆明市| 长海县| 北京市| 江门市| 车险| 阿巴嘎旗| 灵宝市| 潼关县| 通辽市| 兰考县| 盐亭县| 巴东县| 鲜城| 兰西县| 山西省| 洛浦县| 怀远县| 常德市| 炉霍县| 扶绥县| 江达县| 兴国县| 陵水| 阿坝| 凤凰县| 本溪市| 马关县| 龙陵县| 新余市| 嘉黎县| 临江市| 三台县| 海兴县| 石河子市| 富民县|