溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL鎖機(jī)制原理是什么

發(fā)布時(shí)間:2021-08-09 14:25:34 來源:億速云 閱讀:134 作者:chen 欄目:數(shù)據(jù)庫

這篇文章主要介紹“MySQL鎖機(jī)制原理是什么”,在日常操作中,相信很多人在MySQL鎖機(jī)制原理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL鎖機(jī)制原理是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

  很多時(shí)候,可以通過經(jīng)驗(yàn)來猜測什么樣的鎖對應(yīng)用程序更合適,不過通常很難說一個(gè)鎖比別的更好,這全都要依據(jù)應(yīng)用程序來決定,不同的地方可能需要不同的鎖。

  想要決定是否需要采用一個(gè)支持行級鎖的存儲引擎,就要看看應(yīng)用程序都要做什么,其中的查詢、更新語句是怎么用的。例如,很多的web應(yīng)用程序大量的做查詢,很少刪除,主要是基于索引的更新,只往特定的表中插入記錄。采用基本的MySQLMyISAM表就很合適了。

  MySQL中對表級鎖的存儲引擎來說是釋放死鎖的。避免死鎖可以這樣做到:在任何查詢之前先請求鎖,并且按照請求的順序鎖表。

  MySQL中用于WRITE(寫)的表鎖的實(shí)現(xiàn)機(jī)制如下:

  如果表沒有加鎖,那么就加一個(gè)寫鎖。

  否則的話,將請求放到寫鎖隊(duì)列中。

  MySQL中用于READ(讀)的表鎖的實(shí)現(xiàn)機(jī)制如下:

  如果表沒有加寫鎖,那么就加一個(gè)讀鎖。

  否則的話,將請求放到讀鎖隊(duì)列中。

  當(dāng)鎖釋放后,寫鎖隊(duì)列中的線程可以用這個(gè)鎖資源,然后才輪到讀鎖隊(duì)列中的線程。

  這就是說,如果表里有很多更新操作的話,那么Select必須等到所有的更新都完成了之后才能開始。

  從MySQL3.23.33開始,可以通過狀態(tài)變量Table_locks_waited和Table_locks_immediate來分析系統(tǒng)中的鎖表爭奪情況:

  mysql>SHOWSTATUSLIKE'Table%';

  +-----------------------+---------+

  |Variable_name|Value|

  +-----------------------+---------+

  |Table_locks_immediate|1151552|

  |Table_locks_waited|15324|

  +-----------------------+---------+

  MySQL鎖機(jī)制究竟是怎樣的

  在MySQL3.23.7(在Windows上是3.23.25)以后,在MyISAM表中只要沒有沖突的Insert操作,就可以無需使用鎖表自由地并行執(zhí)行Insert和Select語句。也就是說,可以在其它客戶端正在讀取MyISAM表記錄的同時(shí)時(shí)插入新記錄。如果數(shù)據(jù)文件的中間沒有空余的磁盤塊的話,就不會(huì)發(fā)生沖突了,因?yàn)檫@種情況下所有的新記錄都會(huì)寫在數(shù)據(jù)文件的末尾(當(dāng)在表的中間做刪除或者更新操作時(shí),就可能導(dǎo)致空洞)。當(dāng)空洞被新數(shù)據(jù)填充后,并行插入特性就會(huì)自動(dòng)重新被啟用了。

  如果想要在一個(gè)表上做大量的Insert和Select操作,但是并行的插入?yún)s不可能時(shí),可以將記錄插入到臨時(shí)表中,然后定期將臨時(shí)表中的數(shù)據(jù)更新到實(shí)際的表里??梢杂靡韵旅顚?shí)現(xiàn):

  mysql>LOCKTABLESreal_tableWRITE,insert_tableWRITE;

  mysql>InsertINTOreal_tableSelect*FROMinsert_table;

  mysql>TRUNCATETABLEinsert_table;

  mysql>UNLOCKTABLES;

  InnoDB使用行級鎖,BDB使用頁級鎖。對于InnoDB和BDB存儲引擎來說,是可能產(chǎn)生死鎖的。這是因?yàn)镮nnoDB會(huì)自動(dòng)捕獲行鎖,BDB會(huì)在執(zhí)行SQL語句時(shí)捕獲頁鎖的,而不是在事務(wù)的開始就這么做。

  很多的掃描表和對全表的GROUPBY操作,但是沒有任何寫表。

  表級鎖和行級鎖或頁級鎖之間的不同之處還在于:

  將同時(shí)有一個(gè)寫和多個(gè)讀的地方做版本(例如在MySQL中的并發(fā)插入)。也就是說,數(shù)據(jù)庫/表支持根據(jù)開始訪問數(shù)據(jù)時(shí)間點(diǎn)的不同支持各種不同的試圖。其它名有:時(shí)間行程,寫復(fù)制,或者是按需復(fù)制。

  原文:Versioning(suchasweuseinMySQLforconcurrentinserts)whereyoucanhaveonewriteratthesametimeasmanyreaders.Thismeansthatthedatabase/tablesupportsdifferentviewsforthedatadependingonwhenyoustartedtoaccessit.Othernamesforthisaretimetravel,copyonwrite,orcopyondemand.

  按需復(fù)制在很多情況下比頁級鎖或行級鎖好多了。盡管如此,最壞情況時(shí)還是比其它正常鎖使用了更多的內(nèi)存。

  可以用應(yīng)用程序級鎖來代替行級鎖,例如MySQL中的GET_LOCK()和RELEASE_LOCK()。但它們是勸告鎖(原文:Theseareadvisorylocks),因此只能用于安全可信的應(yīng)用程序中。

到此,關(guān)于“MySQL鎖機(jī)制原理是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI