一、資料庫為什麼需要鎖?
為了保證資料的一緻性。mysql資料庫存在多種資料引擎,MySQL各存儲引擎使用了三種類型(級别)的鎖定機制:表級鎖定,行級鎖定和頁級鎖定。
二、表級鎖
1.表級鎖(表級鎖一次會将整個表鎖定,所可以很好的避免死鎖問題)
(1)鎖定粒度大,鎖沖突機率高、并發度低;
(2)好處是不會出現死鎖、開銷小、擷取鎖和釋放鎖的速度很快;
(3)使用表級鎖定的主要是MyISAM,MEMORY,CSV等一些非事務性存儲引擎,适用于以查詢為主,少量更新的應用。
三、行級鎖
1.行級鎖
(1)好處是鎖定對象的顆粒度很小,發生鎖沖突的機率低、并發度高;
(2)缺點是開銷大、加鎖慢,行級鎖容易發生死鎖;
(3)使用行級鎖定的主要是InnoDB存儲引擎、及分布式存儲引擎NDBCluster等。适用于對事務完整性要求較高的系統。InnoDB支援行級鎖(row-level locking)和表級鎖,預設為行級鎖。
2.InnoDB行級鎖類型
(1)共享鎖:又稱讀鎖,簡單講就是多個事務對同一資料進行共享一把鎖,都能通路到資料,但是隻能讀不能修改。
(2)排他鎖:又稱寫鎖,排他鎖就是不能與其他所并存,如一個事務擷取了一個資料行的排他鎖,其他事務就不能再擷取該行的其他鎖,隻有擷取排他鎖的事務可以對資料進行讀取和修改。
(3)意向鎖是InnoDB自動加的,不需使用者幹預。意向鎖不會與行級的共享 / 排他鎖互斥!!!
3.注意事項
(1)排他鎖指的是一個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖。但可以直接通過select ...from...查詢資料,因為普通查詢沒有任何鎖機制。
(2)mysql InnoDb引擎中update,delete,insert語句自動加排他鎖;

意向鎖之間是互相相容的,意向共享鎖和普通共享鎖之間是相容的。
4.适用場景
(1)共享鎖适用于:用來确認某行記錄是否存在,并確定沒有人對這個記錄進行UPDATE或者DELETE操作,如果目前事務也需要對該記錄進行更新操作,則很有可能造成死鎖。
(2) 排他鎖适用于:鎖定行記錄後需要進行更新操作的應用;
共享鎖(S):
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
排他鎖(X):
SELECT * FROM table_name WHERE ... FOR UPDATE
5.為什麼使用意向鎖?
提高了效率。
1.事務 A 先擷取了某一行的 排他鎖 ,并未送出:
SELECT * FROM users WHERE id = 6 FOR UPDATE;
(1)事務 A 擷取了 users 表上的 意向排他鎖 。
(2)事務 A 擷取了 id 為 6 的資料行上的 排他鎖 。
2.事務 C 也想擷取 users 表中某一行的 排他鎖 :
SELECT * FROM users WHERE id = 5 FOR UPDATE;
(1)事務 C 申請 users 表的 意向排他鎖 。
-
- 事務 C 檢測到 事務 A 持有 users 表的 意向排他鎖 。
- 因為意向鎖之間并不互斥,是以 事務 C 擷取到了 users 表的 意向排他鎖 。
- 因為id 為 5 的資料行上不存在任何 排他鎖 ,最終 事務 C 成功擷取到了該資料行上的 排他鎖 。
四、頁面鎖
1.頁面鎖
(1)介于行級鎖和表級鎖之間;
(2)會發生死鎖;
(3)BDB采用頁面鎖(page-level locking)或表級鎖,預設為頁面鎖。
五、關于鎖的常見問題
1.InnoDB存儲引擎什麼時候會鎖住整張表(什麼時候使用行級鎖),什麼時候或隻鎖住一行呢(使用行鎖)?
隻有通過索引條件查詢資料,InnoDB才使用行級鎖,否則,InnoDB将使用表鎖!記住:一定要記住為比對條件字段加索引。
2.什麼時候使用行級鎖?什麼時候使用表級鎖?
(1)在增删改查時比對的條件字段不帶有索引時,innodb使用的是表級鎖,
3.行級鎖鎖的是什麼?行級鎖怎麼實作加鎖?
(1)行級鎖是針對索引加的鎖;
(2) InnoDB行鎖是通過索引上的索引項來實作的,這一點MySQL與Oracle不同,後者是通過在資料中對相應資料行加鎖來實作的。
4.mysql讀鎖和寫鎖?
(1)因為隻有觸發了讀寫鎖,我們才會談是進行行級鎖定還是進行表級鎖定;
(2)用select 指令時觸發讀鎖,當使用update,delete,insert時觸發寫鎖,并且使用rollback或commit後解除本次鎖定。
5.常見的鎖算法:
next KeyLocks鎖,同時鎖住記錄(資料),并且鎖住記錄前面的Gap
Gap鎖,不鎖記錄,僅僅記錄前面的Gap
Recordlock鎖(鎖資料,不鎖Gap)
是以其實 Next-KeyLocks=Gap鎖+ Recordlock鎖
6.什麼時候會釋放鎖?