關於Mysql中行鎖和表鎖

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

相關文章
相關標籤/搜索