回覆列表
  • 1 # 藍風24

    概念:

    鎖是用來管理對共享檔案的併發訪問。innodb會在行級別上對資料庫上鎖。不過innodb儲存引擎會在資料庫內部其他多個地方使用鎖,從而允許對不同資源提供併發訪問。例如操作緩衝池中的LRU列表,刪除,新增,移動LRU列表中的元素,為了保證一致性,必須有鎖的介入。MyISAM引擎是表鎖,而InnoDB提供一致性的非鎖定讀、行級鎖,且行級鎖沒有相關額外的開銷。

    table-level locking(表級鎖)

    整個表被客戶鎖定。根據鎖定的型別,其他客戶不能向表中插入記錄,甚至從中讀資料也受到限制MyISAM、MEMORY預設鎖級別,個別時候,InnoDB也會升級為表級鎖

    row-level locking(行級鎖)

    只有執行緒當前使用的行被鎖定,其他行對於其他執行緒都是可用的InnoDB預設行級鎖。是基於索引資料結構來實現的,而不是像ORACLE的鎖,是基於block的。InnoDB也會升級為表級鎖,全表/全索引更新,請求autoinc鎖等

    page-level locking(頁級鎖)

    鎖定表中某些行集合(稱做頁),被鎖定的行只對鎖定最初的執行緒是可行。如果另外一個執行緒想要向這些行寫資料,它必須等到鎖被釋放。不過其他頁的行仍然可以使用BDB預設頁級鎖

    lock與latch

    latch稱為閂鎖(輕量級的鎖),因為其要求鎖定的時間必須非常短。若持續的時間長,則應用的效能會非常差。在InnoDB儲存引擎中,又可以分為mutex(互斥量)和rwlock(讀寫鎖)。其目的是用來保證併發執行緒操作臨界資源的正確性,並且通常沒有死鎖檢測的機制。latch可以透過命令show engine innodb mutex來進行檢視。如圖:

    由上圖可以看出列Type顯示的總是InnoDB,列Name顯示latch的資訊以及所在原始碼的行數,列Status中顯示的os_waits表示作業系統等待的次數。

    lock的物件是事務,用來鎖定的是資料庫中的物件,如表、頁、行。並且一般lock的物件僅在事務commit或者rollback後釋放(不同事務隔離級別釋放的時間可能不一樣)。有死鎖機制。二則的區別如下:

    特點:

    InnoDB是透過對索引上的索引項加鎖來實現行鎖。這種特點也就意味著,只有透過索引條件檢索資料,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖。

    鎖的型別:

    有兩種標準的行級鎖:

    共享鎖(S lock):允許一個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖.SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

    排它鎖(X lock):允許獲得排他鎖的事務更新資料,阻止其他事務取得相同資料集的共享讀鎖和排他鎖.SELECT * FROM table_name WHERE ... FOR UPDATE

    InnoDB儲存引擎支援意向鎖且設計比較簡練,分為兩種內部使用的意向鎖(Intention Locks),這兩種意向鎖都是表鎖。(意向鎖是InnoDB自動加的)

    意向共享鎖(IS):事務打算給資料行加行共享鎖,事務在給一個數據行加共享鎖前必須先取得該表的IS鎖.

    意向獨佔鎖(IX):事務打算給資料行加行排他鎖,事務在給一個數據行加排他鎖前必須先取得該表的IX鎖.

  • 中秋節和大豐收的關聯?
  • 8千至1萬,配一臺主機+顯示器,喜歡光汙染?