MySQL不支持鎖升級,要一次獲取所有需要的鎖。
表鎖
MyISAM中的表鎖。寫請求比讀請求優先級高。
表共享讀鎖(Table Read Lock):lock tables xxx read local
表獨占寫鎖(Table Write Lock):lock tables xxx write
concurrent_insert:控制並發插入行為,配合read local。
0:不允許並發插入。
1:如果表中沒有空洞(表中間沒有被刪除的行),允許在一個進程讀表的同時,另一個從表尾插入(默認)。
2:無論有沒有空洞,都允許表尾插入。
行鎖
InnoDB下,是給索引加行鎖,如果沒有通過索引條件檢索數據,則會使用表鎖。
共享鎖(S):lock in share mode
排他鎖(X):for update
意向鎖
表級鎖,在獲得一個鎖之前,會先申請獲得其意向鎖,來阻塞其他沖突的鎖請求。
假設線程A獲得一個行鎖,此時線程B想獲得一個表鎖,如果沒有意向鎖,則線程B需要先判斷有沒有沖突的表鎖,然后判斷表中每一行有沒有沖突的行鎖,這種方式效率很低。而有了意向鎖之后,意向鎖作為一個表級鎖,可以極高效率地判斷鎖沖突情況。
間隙鎖
鎖住滿足索引條件檢索的區間,其他事務插入該區間內的數據時會失敗,解決了幻讀的問題。