MySQL的3種鎖定機制 數據庫鎖定機制是數據庫為了保證數據的一致性而使各種共享資源在並發訪問時訪問變得有序所設計的一種規則。 MySQL各存儲引擎使用了3種類型的鎖定機制: 1. 行級鎖定(row-level) --- MyISAM、Memory、CSV *鎖定對象顆粒度最小,發生資源爭用的概率最小,在並發處理能力上有較大優勢。 *缺點是每次獲取鎖和釋放鎖需要做的事情很多,帶來消耗大,也最容易發生死鎖。 2. 表級鎖定(table-level)--- Innodb、NDB Cluster *鎖定對象顆粒度最大,實現邏輯簡單,獲取鎖和釋放鎖的速度很快,一次會將整個表鎖定,可以很好避免死鎖。 *缺點是出現資源爭用的概率最高,致使並發度大打折扣。 *主要分為2種類型:讀鎖定和寫鎖定 *通過4個鎖定隊列來維護這2種鎖定: Current read-lock queue (lock->read) --- 存放持有讀鎖的所有線程,按獲取到鎖的時間順序存放 Pending read-lock queue (lock->read_wait) --- 存放正在等待鎖定資源的線程 Current write-lock queue (lock->write) --- 存放持有寫鎖的所有線程,按獲取到鎖的時間順序存放 Pending write-lock queue (lock->write_wait) --- 存放正在等待鎖定資源的線程 *MySQL內部實現表鎖定多達11種類型,由系統中的一個枚舉量(thr_lock_type)定義,各值描述如下: IGNORE --- 當發生鎖請求的時候內部交互使用,在鎖定結構和隊列中並不會有任何信息存儲 UNLOCK --- 釋放鎖定請求的交互用鎖類型 READ --- 普通讀鎖定 WRITE --- 普通寫鎖定 READ_WITH_SHARED_LOCKS --- 在Innodb中使用到,由如下方式產生:SELECT ... LOCK IN SHARE MODE READ_HIGH_PRIORITY --- 高優先級讀鎖定 READ_NO_INSERT --- 不允許Concurrent Insert的鎖定 WRITE_ALLOW_WRITE --- 當由存儲引擎自行處理鎖定的時候,mysqld允許其他的線程再獲取讀或寫鎖定,因為即使資源沖突,存儲引擎自己也會知道怎麼處理 WRITE_ALLOW_READ --- 這種鎖定發生在對表做DDL(ALTER TABLE ...)的時候,MySQL可以允許其他線程獲取讀鎖定,因為MySQL是通過重建整個表然後再RENAME而實現的該功能,所以整個過程原表仍然可以提供讀服務 WRITE_CONCURRENT_INSERT --- 正在進行Concurrent Insert 時候所使用的鎖定方式,該鎖定進行的時候,除了READ_NO_INSERT之外的其他任何讀鎖定請求都不會被阻塞 WRITE_DELAYED --- 在使用INSERT DELAYED時候的鎖定類型 WRITE_LOW_PRIORITY --- 顯示聲明的低級別鎖定方式,通過設置LOW_PRIORITY_UPDAT = 1 而產生 WRITE_ONLY --- 當在操作過程中某個鎖定異常中斷之後系統內部需要進行CLOSE TABLE操作,在這個過程中出現的鎖定類型就是WRITE_ONLY 3. 頁級鎖定(page-level) --- BerkeleyDB 鎖定顆粒度介於行級鎖定和表級鎖定之間,所需資源開銷以及所能提供的並發能力也介於兩者之間,與行級鎖定一樣會發生死鎖。