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)頁面鎖定
開銷與加鎖時間界於表鎖與行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般。
以上是mysql資料庫鎖有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!