天天看點

MySQL中的表鎖行鎖共享鎖很難嗎?看了本文就清楚了哦

MySQL中的表鎖行鎖共享鎖很難嗎?看了本文就清楚了哦

  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的最大不同點有兩個:

  1. InnoDB支援事務(transaction);
  2. 預設采用行級鎖。加鎖可以保證事務的一緻性。

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中的鎖差別

  這兩個種類的鎖的作用都是一樣的,都是為了解決資源并發的情況下,對資源的寫問題的控制。簡單來說就是解決并發。

2.MySQL中鎖的本質