無論數(shù)據(jù)有沒有上鎖都可以使用select ...from...查詢數(shù)據(jù),因為普通查詢是快照讀沒有任何鎖機制。
事物隔離級別(mysql默認可重復(fù)讀):

臟讀:讀到其他事物未提交的數(shù)據(jù),可能其他事物事物失敗回滾。
不可重復(fù)讀:同一個事務(wù)中第一次讀取和第二次讀取同一行數(shù)據(jù),期間數(shù)據(jù)被修改了,兩次讀取到的數(shù)據(jù)內(nèi)容不同。
幻讀:同一個事務(wù)中兩次查找的出的結(jié)果數(shù)量不同,兩次查找期間插入(刪除)了新的符合條件的數(shù)據(jù)。RR級別時MVCC的事物版本號解決了讀數(shù)據(jù)的幻讀(快照讀)。但是在修改數(shù)據(jù)時,仍然會更新比當(dāng)前事物版本號高的事物插入并提交的數(shù)據(jù)(當(dāng)前讀)。
共享鎖:
讀鎖又稱為共享鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務(wù)對于同一數(shù)據(jù)可以共享一把鎖,都能訪問到數(shù)據(jù),但是只能讀不能修改。
加共享鎖可以使用select ... lock in share mode語句。
排他鎖:
寫鎖又稱為排他鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所并存,如一個事務(wù)獲取了一個數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務(wù)是可以對數(shù)據(jù)就行讀取和修改。
加排他鎖可以使用select ...for update?語句。
行鎖:
行鎖是排他鎖的一種,它只鎖住一行數(shù)據(jù),是通過給主鍵加鎖實現(xiàn)的。在用for update給查詢結(jié)果加鎖時,如果查詢使用了二級索引,則在二級索引上找到主鍵索引,并把對應(yīng)記錄加鎖。加鎖的數(shù)據(jù)可能多于查詢出來的數(shù)據(jù),因為可能有些條件沒有使用索引。如果查詢沒有使用索引,則使用表鎖。
innodb有行鎖,myisam則沒有。
間隙鎖:
間隙鎖本質(zhì)上是用于阻止其他事務(wù)在該間隙內(nèi)(兩邊都是開區(qū)間)插入新記錄,是不區(qū)分共享間隙鎖或互斥間隙鎖的,而且間隙鎖是不互斥的,即兩個事務(wù)可以同時持有包含共同間隙的間隙鎖。這里的共同間隙包括兩種場景:其一是兩個間隙鎖的間隙區(qū)間完全一樣;其二是一個間隙鎖包含的間隙區(qū)間是另一個間隙鎖包含間隙區(qū)間的子集。也就是說間隙鎖的應(yīng)用場景包括并發(fā)讀取、并發(fā)更新、并發(fā)刪除和并發(fā)插入。
在RU和RC兩種隔離級別下,即使你使用select ... in share mode或select ... for update,也無法防止幻讀(讀后寫的場景)。因為這兩種隔離級別下只會有行鎖,而不會有間隙鎖。
臨鍵鎖:
每個數(shù)據(jù)行上的非唯一索引列上都會存在一把臨鍵鎖,當(dāng)某個事務(wù)持有該數(shù)據(jù)行的臨鍵鎖時,會鎖住該行數(shù)據(jù)上下兩個區(qū)間。如下圖,當(dāng)使用for update獲取cnt=5的臨間鎖(cnt字段必須要有索引)時。無法插入1<=cnt<10的數(shù)據(jù)。cnt=10的數(shù)據(jù)可以插入,cnt=1則不行。我的innodb和MySQL版本都是5.6.42。臨間鎖=行鎖+上下兩個區(qū)間的間隙鎖。

插入意向鎖:
插入意向鎖,是間隙鎖的一種。RR級別是有間隙鎖的。即使在同一個索引,同一個區(qū)間,但插入的記錄并不沖突 ,事物之間不會相互堵塞。插入意向鎖和間隙鎖不兼容。
意向共享/排他鎖:
意向鎖致力于解決表鎖和行鎖沖突的問題。意向鎖本身時表鎖。意向共享鎖和排他鎖之間本身不會互相沖突。
如果沒有意向鎖,事物A獲得了表中一條記錄的寫鎖,此時事物B想要鎖住整張表,必須要遍歷所有數(shù)據(jù)確保所有數(shù)據(jù)都沒有被加鎖,而遍歷一半發(fā)現(xiàn)事物A鎖住了一條記錄,于是事物B加表鎖失敗。這樣效率低下。
有了意向鎖,事物A對表先申請意向共享/排他鎖,然后對相應(yīng)記錄添加記錄鎖。此時事物B想鎖住整張表,發(fā)現(xiàn)表上已經(jīng)有意向共享/排他鎖,說明表中某些數(shù)據(jù)正在被加讀/寫鎖。此時直接加鎖失敗。當(dāng)然,如果事物B只想修改幾條數(shù)據(jù)的話,可以申請意向排他鎖(即使表上已經(jīng)有意向排他鎖也不妨礙其他事物申請意向排他鎖),然后看自己要修改的記錄是否有鎖,沒有鎖則直接加鎖修改,有鎖則掛起等待。
自增鎖:
自增鎖是一種特殊的表級鎖,主要用于事務(wù)中插入自增字段(AUTO_INCREMENT),也就是我們最常用的自增主鍵id。