MySQL數據庫中的鎖有:1、共享鎖,表示對數據進行讀操作;2、排他鎖,表示對數據進行寫操作;3、行鎖,對一行記錄加鎖,只影響一條記錄;4、意向鎖,為了在一個事務中揭示下一行將要被請求鎖的類型。
mysql數據庫鎖
1、共享鎖(Shared Lock,也叫S鎖)
共享鎖(S)表示對數據進行讀操作。因此多個事務可以同時為一個對象加共享鎖。
產生共享鎖的sql語句:
select?*?from?ad_plan?lock?in?share?mode;
2、排他鎖(Exclusive Lock,也叫X鎖)
排他鎖表示對數據進行寫操作。如果一個事務對對象加了排他鎖,其他事務就不能再給它加任何鎖了。
產生排他鎖的sql語句:
?select?*?from?ad_plan?for?update;
3、行鎖(Row Lock)
對一行記錄加鎖,只影響一條記錄。
通常用在DML語句中,如INSERT, UPDATE, DELETE等。
InnoDB行鎖是通過給索引上的索引項加鎖來實現的,這一點MySQL與Oracle不同,后者是通過在數據塊中對相應數據行加鎖來實現的。
InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索數據,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!
4、意向鎖
意向鎖是表級鎖,其設計目的主要是為了在一個事務中揭示下一行將要被請求鎖的類型。InnoDB 中的兩個表鎖:
意向共享鎖(IS):表示事務準備給數據行加入共享鎖,也就是說一個數據行加共享鎖前必須先取得該表的IS鎖;
意向排他鎖(IX):類似上面,表示事務準備給數據行加入排他鎖,說明事務在一個數據行加排他鎖前必須先取得該表的IX鎖。
意向鎖是 InnoDB 自動加的,不需要用戶干預。
對于INSERT、UPDATE和DELETE,InnoDB 會自動給涉及的數據加排他鎖;對于一般的SELECT語句,InnoDB 不會加任何鎖,事務可以通過以下語句顯式加共享鎖或排他鎖。
共享鎖:SELECT … LOCK IN SHARE MODE;
排他鎖:SELECT … FOR UPDATE;
鎖的級別
根據鎖的級別或密度來劃分,MySQL有三種鎖的級別:頁級、表級、行級。
(1)表級鎖
開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。
(2)行級鎖
開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。
(3)頁面鎖
開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。