鎖
從鎖的性能有樂觀鎖和悲觀鎖;鎖的粒度有行鎖、頁鎖、表鎖;鎖的對數據庫操作類型有讀鎖、寫鎖、意向鎖
- 樂觀鎖:采用cas機制,不會阻塞數據庫操作,只會針對當前事務進行失敗重試。(用于寫操作不多的情況)
- 悲觀鎖:鎖住操作的數據,阻塞其他事務對同一資源的操作。
- 行鎖:鎖住一行數據
InnoDB中,行鎖是加載索引上的,
1.在RR隔離級別中,加鎖過程中沒有找到索引則會升級為表鎖
2.在RC隔離級別中,加鎖過程中沒有找到索引則不會有鎖升級 - 表鎖:鎖住整張表,
‐‐手動增加表鎖
lock table 表名稱 read(write),表名稱2 read(write);
‐‐查看表上加過的鎖
show open tables;‐‐刪除表鎖
unlock tables;
-
頁鎖:只有BDB存儲引擎支持,鎖住索引頁。
-
間隙鎖(Gap Locak):間隙鎖在RR隔離級別生效,會鎖住索引件的間隙(比如用a進行鎖)
當擁有索引的a進行加鎖,則(111-120)都會被鎖住。 -
讀鎖:(共享鎖、S鎖(Shared)):select … lock in share mode;
讀鎖是共享的,多個事務可以同時讀取同一個資源,但不允許其他事務修改。 -
寫鎖:(排他鎖、x鎖(exclusive)):select … for update;
寫鎖是排他的,會阻塞其他的寫鎖和讀鎖,update、delete、insert都會加寫鎖。 -
讀鎖和寫鎖是悲觀鎖
-
意向鎖(Intention Lock):又稱I鎖,為了提高表鎖效率而增加。mysql進行表鎖時會掃描表中是否存在讀鎖或者寫鎖,當有事務給表的數據行加了共享鎖或排他鎖,同時會給表設置一個標識,代表已經有行鎖了,其他事務要想對表加表鎖時,就不必逐行判斷有沒有行鎖可能跟表鎖沖突了,直接讀這個標識就可以確定自己該不該加表鎖。