
MySQL資料庫中的鎖還是非常重要的,本文重點給大家詳細的來介紹下MySQL資料中的各種鎖。
一、表鎖和行鎖
1.表鎖
表鎖的優勢:開銷小;加鎖快;無死鎖
表鎖的劣勢:鎖粒度大,發生鎖沖突的機率高,并發處理能力低
加鎖的方式:自動加鎖。查詢操作(SELECT),會自動給涉及的所有表加讀鎖,更新操作(UPDATE、DELETE、INSERT),會自動給涉及的表加寫鎖。也可以顯示加鎖:
共享讀鎖:lock table tableName read;
獨占寫鎖:lock table tableName write;
批量解鎖:unlock tables;
2.行鎖
行鎖的劣勢:開銷大;加鎖慢;會出現死鎖
行鎖的優勢:鎖的粒度小,發生鎖沖突的機率低;處理并發的能力強
加鎖的方式:自動加鎖。對于UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及資料集加排他鎖;對于普通SELECT語句,InnoDB不會加任何鎖;當然我們也可以顯示的加鎖:
共享鎖:select * from tableName where … + lock in share more
排他鎖:select * from tableName where … + for update
InnoDB和MyISAM的最大不同點有兩個:
- InnoDB支援事務(transaction);
- 預設采用行級鎖。加鎖可以保證事務的一緻性。
3.表鎖和行鎖對比
- 鎖定粒度:表鎖 > 行鎖
- 加鎖效率:表鎖 > 行鎖
- 沖突機率:表鎖 > 行鎖
- 并發性能:表鎖 < 行鎖
二、鎖的細分
鎖名 | 鎖級别 | 英文名稱 |
共享鎖 | 行鎖 | Shared Locks |
排它鎖 | 行鎖 | Exclusive Locks |
意向共享鎖 | 表鎖 | Intention Shared Locks |
意向排它鎖 | 表鎖 | Intention Exclusive Locks |
1.共享鎖
又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對于同一個資料可以共享一把鎖,都能通路到資料,但是隻能讀不能修改;
select * from table where id = 1 Lock IN SHARE MODE;
2.排他鎖
又稱為寫鎖,簡稱為X鎖,排它鎖不能與其他鎖并存,如果一個事務擷取了一個資料行的排它鎖,其他事務就不能再擷取該鎖,隻有該擷取了排它鎖的事務是可以對資料行進行讀取和修改。
加鎖方式:
自動:delete / update / insert 預設加上X鎖
手動:select * from table for update
3.意向鎖
意向鎖是由資料引擎自己維護的,使用者無法手動操作意向鎖.
意向共享鎖(Intention Shared Lock,簡稱IS鎖)。表示事務準備給資料行加入共享鎖,也就是一個資料行加共享鎖前必須先取得該表的IS鎖
意向排它鎖(Intention Exclusive Lock,簡稱IX鎖)表示事務準備給資料行加入排它鎖,說明事務在一個資料行加排它鎖前必須先獲得該表的IX鎖。
為什麼需要表級别的意向鎖?
假設沒有意向鎖,我們加表鎖的時候,需要去掃描全表是否有存在鎖,資料量過大的時候,會導緻加鎖效率很低。但是如果我們在加鎖的時候,資料庫給我們自動加上意向鎖,标記目前表,某個地方已經有了鎖,那麼我們就可以以很低的消耗,來完成是否加鎖這個動作.
三、擴充問題
1.和Java中的鎖差別
這兩個種類的鎖的作用都是一樣的,都是為了解決資源并發的情況下,對資源的寫問題的控制。簡單來說就是解決并發。