鎖機制之MySQL表鎖

2022-04-05 06:57:32 字數 1801 閱讀 8037

如何保證在被併發訪問時資料的一致性、完整性和有效性,是資料庫關注的核心問題。資料庫的鎖機制就是為了解決這個問題而出現的。鎖機制在一定程度上將對共享資源的併發訪問有序化,從而保證資料的一致完整性。鎖機制的好壞直接影響到資料的併發處理能力和效能。乙個好的鎖機制的實現是乙個資料的核心競爭力之一。

我們知道在mysql中存在表級鎖、頁級鎖和行級鎖,其中mysql預設實現了表級鎖定。其它鎖機制在不同的儲存引擎中實現,這也是mysql特點之一:針對特定的應用場景可以使用當前合適的儲存引擎。先不論各種儲存引擎和鎖機制的優劣,這裡只是說說他們各自的特點和實現。

myisam儲存引擎作為曾經的預設儲存引擎,其使用的鎖機制是mysql提供的預設表級鎖定。雖然它沒有實現自己的鎖機制,但是在預設表級鎖的基礎上,增加了併發插入的特性。併發插入與系統引數concurrent_insert相關,concurrent_insert有三個值:

concurrent_insert=0 關閉併發寫入

concurrent_insert=1 (預設)在沒有空資料塊的myisam表中啟用並行插入

concurrent_insert=2 為所有myisam表啟用並行插入。如果表有空記錄或正被另一線程使用,新行將插入到表的最後。如果表未使用,mysql將進行普通讀鎖定並將新行插入空記錄。

此引數與myisam儲存引擎的資料儲存方式相關:常規情況下,myisam的新資料都會被附加到資料檔案的結尾,當做了一些delete操作之後,資料檔案就不再是連續的,形象一點來說,就是資料檔案裡出現了很多hole,此時再插入新資料時,按預設設定會先看這些hole的大小是否可以容納下新資料,如果可以,則直接把新資料儲存到hole裡,反之,則把新資料儲存到資料檔案的結尾。之所以這樣做是為了減少資料檔案的大小,降低檔案碎片的產生。

如果我們使用concurrent_insert=2(通常也推薦這樣做),這樣會產生較多的檔案碎片,為此,我們需要在設定這個引數值的同時,定期對資料表進行optimize table操作。此操作可以去除刪除操作後留下的資料檔案碎片,減小檔案尺寸,加快未來的讀寫操作。但是,在optimize table執行過程中,mysql會鎖表。

mysql的表鎖有兩種模式:表共享讀鎖(table read lock)和表獨佔寫鎖(table write lock)。共享鎖和獨佔鎖在鎖機制中是一種非常普通的實現方式。 myisam在執行查詢語句前,會自動給涉及的所有表加讀鎖,在執行更新操作(ddl)前,會自動給相關的表加寫鎖。 mysql的讀寫鎖(mysys/thr_lock.c)是通過4個佇列來維護的,他們分別是:

當前讀鎖佇列(lock->read): 儲存當前持有讀鎖所有執行緒相關資訊,按獲取鎖的時間排序

讀鎖等待佇列(lock->read_wait):儲存正在等待讀鎖鎖定資源的執行緒相關資訊

當前寫鎖佇列(lock->write):儲存當前持有寫鎖所有執行緒相關資訊,按獲取鎖的時間排序

寫鎖等待佇列(lock->write_wait):儲存正在等待寫鎖鎖定資源的執行緒相關資訊

對於讀鎖,當請求的資源沒有加寫鎖或在寫鎖等待佇列中沒有更高優先順序的寫鎖定在等待。讀鎖是共享鎖,不會阻塞其他程序對同一資源的讀請求,但會阻塞對同一資源的寫請求。只有當讀鎖釋放後,才會執行其它程序的寫操作。

對於寫鎖,當請求的資源在當前寫鎖佇列、寫鎖等待佇列或當前讀鎖佇列,進入等待寫鎖佇列;寫鎖會阻塞其他程序對同一資源的讀和寫操作,只有當寫鎖釋放後,才會執行其它程序的讀寫操作。

表鎖是mysql資料庫中加鎖粒度最大的一種鎖,除此之外,mysql還有頁級鎖和行鎖。表鎖的執行開銷小,加鎖速度快,不會出現死鎖,但是其加鎖的粒度大,發生鎖衝突的概率非常高,從而導致併發度低。可以考慮使用主從結構解決併發度低的問題。

參考資料

《mysql效能調優與架構設計》 – 簡朝陽

Mysql的鎖機制之表鎖

在資料庫中,除傳統的計算資源 如cpu,ram,i o等 的爭用外,資料也是一種供許多使用者共享的資源,如何保證資料併發訪問的一致性,有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素.從這個角度來說,鎖對資料庫而言現得尤其重要,也更加複雜.按照對資料庫的操作分為讀...

mysql鎖機制之表鎖 三

顧名思義,表鎖就是一鎖鎖一整張表,在表被鎖定期間,其他事務不能對該錶進行操作,必須等當前表的鎖被釋放後才能進行操作。表鎖響應的是非索引字段,即全表掃瞄,全表掃瞄時鎖定整張表,sql語句可以通過執行計畫看出掃瞄了多少條記錄。如何加表鎖 myisam 在執行查詢語句 select 前,會自動給涉及的所有...

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...