在已經(jīng)開啟事務的前提下:
共享鎖
A用戶使用了共享鎖徽诲,B用戶可以使用共享鎖或者不用鎖能查詢到數(shù)據(jù)毅人,但是使用排他鎖就會報錯
A更新數(shù)據(jù)铣耘,但是會一直在等待,假如1s后B也更新數(shù)據(jù)囤锉,這時就會陷入死鎖報錯退出坦弟。然后A就能更新成功了
排他鎖
A用戶使用了排他鎖,B用戶就使用排他鎖或者共享鎖來獲取數(shù)據(jù)官地,會一直等待中
A用戶更新數(shù)據(jù)并提交事務酿傍,此時B用戶用戶獲得鎖成功并查得數(shù)據(jù)
InnoDb的鎖的一些注意事項
1. 在不通過索引條件查詢的時候,InnoDB確實使用的是表鎖驱入,而不是行鎖
像我們平常通過id查詢這個就是通過索引條件查詢赤炒,因為一般來說id都會做為主鍵,主鍵會創(chuàng)建索引
如果通過user_name來查詢這個就不是通過索引條件查詢亏较,除非你給user_name加一個索引就可以
2. 由于MySQL的行鎖是針對索引加的鎖莺褒,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄雪情,但是如果是使用相同的索引鍵遵岩,是會出現(xiàn)鎖沖突的。應用設計的時候要注意這一點巡通。
3. 當表有多個索引的時候旷余,不同的事務可以使用不同的索引鎖定不同的行,另外扁达,不論是使用主鍵索引、唯一索引或普通索引蠢熄,InnoDB都會使用行鎖來對數(shù)據(jù)加鎖跪解。
行鎖與表鎖的區(qū)別:
行鎖顧名思義標識該條數(shù)據(jù)被鎖,無法被獲得鎖的操作更新或者訪問
表鎖表示整個表都無法被未獲得鎖的操作更新或者訪問
更深入了解可以看這個Innodb鎖機制
以下內(nèi)容為轉載
mysql鎖機制分為表級鎖和行級鎖签孔,
行級鎖中的共享鎖(select ... lock in share mode)與排他鎖(select ...for update)進行分享交流
共享鎖又稱為讀鎖叉讥,簡稱S鎖,顧名思義饥追,共享鎖就是多個事務對于同一數(shù)據(jù)可以共享一把鎖图仓,都能訪問到數(shù)據(jù),但是只能讀不能修改但绕。
排他鎖又稱為寫鎖救崔,簡稱X鎖惶看,顧名思義,排他鎖就是不能與其他所并存六孵,如一個事務獲取了一個數(shù)據(jù)行的排他鎖纬黎,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖劫窒,但是獲取排他鎖的事務是可以對數(shù)據(jù)就行讀取和修改本今。
對于共享鎖大家可能很好理解,就是多個事務只能讀數(shù)據(jù)不能改數(shù)據(jù)主巍,對于排他鎖大家的理解可能就有些差別冠息,我當初就犯了一個錯誤,以為排他鎖鎖住一行數(shù)據(jù)后孕索,其他事務就不能讀取和修改該行數(shù)據(jù)逛艰,其實不是這樣的。
排他鎖指的是一個事務在一行數(shù)據(jù)加上排他鎖后檬果,其他事務不能再在其上加其他的鎖瓮孙。mysql InnoDB引擎默認的修改數(shù)據(jù)語句,update,delete,insert都會自動給涉及到的數(shù)據(jù)加上排他鎖选脊,select語句默認不會加任何鎖類型杭抠,如果加排他鎖可以使用select ...for update語句,加共享鎖可以使用select ... lock in share mode語句恳啥。
所以加過排他鎖的數(shù)據(jù)行在其他事務種是不能修改數(shù)據(jù)的偏灿,也不能通過for update和lock in share mode鎖的方式查詢數(shù)據(jù),但可以直接通過select ...from...查詢數(shù)據(jù)钝的,因為普通查詢沒有任何鎖機制翁垂。
說了這么多,咱們來看下以下簡單的例子:
我們有如下測試數(shù)據(jù)
現(xiàn)在我們對id=1的數(shù)據(jù)行排他查詢硝桩,這里會使用begin開啟事務沿猜,而不會看見我關閉事務,這樣做是用來測試碗脊,因為提交事務或回滾事務就會釋放鎖啼肩。
打開一個查詢窗口
會查詢到一條數(shù)據(jù),現(xiàn)在打開另一個查詢窗口衙伶,對同一數(shù)據(jù)分別使用排他查和共享鎖查詢兩種方式查詢
排他查
共享查
我們看到開了排他鎖查詢和共享鎖查詢都會處于阻塞狀態(tài)祈坠,因為id=1的數(shù)據(jù)已經(jīng)被加上了排他鎖,此處阻塞是等待排他鎖釋放矢劲。
如果我們直接使用以下查詢呢
我們看到是可以查詢到數(shù)據(jù)的赦拘。
我們再看一下一個事務獲取了共享鎖,在其他查詢中也只能加共享鎖或不加鎖芬沉。
我們看到是可以查詢數(shù)據(jù)的躺同,但加排他鎖就查不到阁猜,因為排他鎖與共享鎖不能存在同一數(shù)據(jù)上。
最后我們驗證下上面說的mysql InnoDb引擎中update,delete,insert語句自動加排他鎖的問題笋籽,
此時共享查詢處于阻塞蹦漠,等待排它鎖的釋放,但是用普通查詢能查到數(shù)據(jù)车海,因為沒用上鎖機制不與排他鎖互斥笛园,但查到的數(shù)據(jù)是修改數(shù)據(jù)之前的老數(shù)據(jù)。
然后我們提交數(shù)據(jù)侍芝,釋放排他鎖看下修改后的數(shù)據(jù)研铆,此時可用排他查,共享查和普通查詢州叠, 因為事務提交后該行數(shù)據(jù)釋放排他鎖棵红,下面就只顯示普通查詢,其他的同學們自己去驗證咧栗。
可以看到結果與預期的一樣逆甜。