mysql的默認引擎是innodb,關於行鎖表鎖,已查找爲例,select......for update(注意:這是一條添加行鎖的語句,只有innodb引擎可使用)mysql
接下來要分析一個問題:何時用的行鎖,何時用的表鎖,有如下幾種狀況:sql
一、在有索引的狀況下主鍵索引與非主鍵索引加的哪一種鎖數據庫
二、在無索引的狀況下加的哪一種鎖spa
注意事項:.net
該操做要在兩個命令窗口進行,由於加鎖要放在begin/commit的事務中,在提交以前設計
mysql都是默認提交,要先取消:set @@autocommit=0htm
1、有索引的狀況下主鍵索引與非主鍵索引加的哪一種鎖blog
主鍵索引:索引
1-1 1-2事務
在主鍵索引的狀況下,id爲1的被加了行鎖,其餘行沒加鎖,屬於行加鎖
非主鍵索引:
2-1 2-2
2-3
2-1與2-2查詢同行,發現被鎖了,2-3查詢其餘行,發現能查詢
因此在非主鍵索引狀況下被加了行鎖
2、無索引狀況下
對於主鍵ID上鎖:
3-1 3-2
發現主鍵ID也是鎖行
對於非主鍵name上鎖:
3-3 3-4
發現非主鍵name是鎖表
總結:
主鍵不管有無索引,上鎖都是上行鎖;
非主鍵有索引上鎖上的是行鎖,無索引上的是表鎖。
InnoDB行鎖是經過給索引上的索引項加鎖來實現的,只有經過索引條件檢索數據,InnoDB才使用行級鎖,不然,InnoDB將使用表鎖。
關於主鍵沒有設置索引也是上行鎖的解釋:
主鍵必定是惟一性索引,惟一性索引並不必定就是主鍵。
所謂主鍵就是可以惟一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但能夠有多個候選索引。由於主鍵能夠惟一標識某一行記錄,因此能夠確保執行數據更新、刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述做用外,經常與外鍵構成參照完整性約束,防止出現數據不一致。數據庫在設計時,主鍵起到了很重要的做用。
1.主鍵能夠保證記錄的惟一和主鍵域非空,數據庫管理系統對於主鍵自動生成惟一索引,因此主鍵也是一個特殊的索引。
2. 一個表中能夠有多個惟一性索引,但只能有一個主鍵。
3. 主鍵列不容許空值,而惟一性索引列容許空值。
4. 索引能夠提升查詢的速度。
其實主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵,意思就是主鍵不實際存在,而索引實際存在在數據庫中,主鍵通常都要建,主要是用來避免一張表中有相同的記錄,索引通常能夠不建,但若是須要對該表進行查詢操做,則最好建,這樣能夠加快檢索的速度。
參考連接:
https://blog.csdn.net/claram/article/details/54023216
http://www.jb51.net/article/50047.htm