mysql中InnoDB儲存引擎的行鎖和表鎖

來源:互聯網
上載者:User

標籤:一個   唯一索引   主鍵   col   描述   innodb   屬性   未使用   任務   

Mysql的InnoDB儲存引擎支援事務,預設是行鎖。因為這個特性,所以資料庫支援高並發,但是如果InnoDB更新資料的時候不是行鎖,而是表鎖的話,那麼其並發性會大打折扣,而且也可能導致你的程式出錯。

而導致行鎖變為表鎖的情況之一就是:

  SQL的更新(update)或者刪除(delete)語句中未使用到索引,導致在InnoDB在對資料進行相應操作的時候必須把整個表鎖起來進行檢索(表鎖)。而如果使用了索引的話,InnoDB只會通過索引條件檢索資料,而只鎖住索引對應的行(行鎖)。

下面記錄一下我遇到的問題:

  描述:

  1. 系統中有一個即時的定時任務,當有條件觸發的時候,會更新對應的表,就先叫其為A表;
  2. 但是同時有一個任務有時候會對A表有寫操作,因此當進行測試的時候,有時候會不固定的出“Lock wait timeout exceeded”的錯誤。

  當出現這個問題的時候,從很多的地方進行了分析,然後都無法得到正確的解決方案(因為描述1模組不是我寫的,所以沒有去查看更新表的代碼操作)

  導致原因:

       在描述1中定時任務更新表A的時候,更新條件中沒有使用索引,導致當進行定時任務更新表的時候形成了表鎖。然後因為表A資料量比較大,檢索較慢,然後導致了描述2中對錶A的寫操作的等鎖逾時。

最常見的索引:

  • 主鍵:眾所周知,內建最高效的索引屬性
  • 唯一索引:屬性值重複率為0,可以作為業務主鍵
  • 普通索引:屬性值重複率大於0,不能作為唯一指定條件

  注意:對於普通索引,當“重複率”低時,甚至接近主鍵或者唯一索引的效果時,依然是行鎖;但是如果“重複率”高時,Mysql不會把這個普通索引當做索引,即會造成一個沒有索引的SQL,從而形成表鎖。

mysql中InnoDB儲存引擎的行鎖和表鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.