減少InnoDB死結發生的方法有什嗎?MySQL學習

來源:互聯網
上載者:User

標籤:MySQL資料庫   資料庫管理員   資料庫工程師   北京MySQL   

  死結的情況發生在不同的的事務相互之間擁有對方需要的鎖,而導致相互一直無限等待。死結可能發生在不同的事務都會對多個相同的表和相同的行上施加鎖,但事務對錶的操作順序不相同。


  為了減少死結的發生,要避免使用lock table語句,要盡量讓修改資料的範圍儘可能的小和快速;當不同的事務要修改多個表或者大量資料時,儘可能的保證修改的順序在事務之間要一致。預設情況下InnoDB下的死結自動偵測功能是開啟的,當InnoDB發現死結時,會將其中的一個事務作為犧牲品復原。

  通過innodb_lock_wait_timeout參數配置自動偵測功能是否開啟,如果關閉的話,InnoDB就會使用innodb_lock_wait_timeout參數來自動復原等待足夠時間的事務。可以通過show engine innodb status語句查看最後一次發生死結的情況。

  InnoDB死結檢測和復原?預設情況下死結檢測功能是開啟的,當死結發生時InnoDB會自動檢測到並犧牲其中的一個或者幾個事務,以便讓其他的事務繼續執行下去。InnoDB選擇犧牲的事務往往是代價比較小的事務,其代價計算是根據事務insert,update, delete的資料行規模決定。如果事務中的某個語句因為錯誤而復原,則這個語句上的鎖可能還會保留,是因為InnoDB僅會儲存行鎖資訊,而不會儲存行鎖是由事務中的哪個語句產生的。如果在一個事務中,select語句調用了函數,而函數中的某個語句執行失敗,則那個語句會復原,如果在整個事務結束時執行rollback,則整個交易回復。可以通過innodb_deadlock_detect 參數關閉死結檢測功能,而僅僅用innodb_lock_wait_timeout的功能來釋放鎖等待 。


  那麼,減少死結發生的方法有什麼呢?

  在事務性資料庫中,死結是個經典的問題,但只要發生的頻率不高則死結問題不需要太過擔心。查看死結的方法有兩種:1.通過show engine innodb status命令可以查看最後一個死結的情況。2.通過innodb_print_all_deadlocks參數配置可以將所有死結的資訊都列印到MySQL的錯誤記錄檔中。

  減少死結發生的方法:1.儘可能的保持事務小型化,減少事務執行的時間可以減少發生影響的機率;2.及時執行commit或者rollback,來儘快的釋放鎖;3.可以選用較低的隔離等級,比如如果要使用select...for update和select...lock in share mode語句時可以使用讀取提交資料隔離等級;4.當要訪問多個表資料或者要訪問相同表的不同行集合時,儘可能的保證每次訪問的順序是相同的。比如可以將多個語句封裝在預存程序中,通過調用同一個預存程序的方法可以減少死結的發生。


  互連網企業大多用的資料庫是MySQL的,想要眾多的IT工作者中脫穎而出,就需要擁有高深的技術,學習增值是必不可少的。學習之路,是貴在堅持的。老男孩教育MySQL DBA課程,幾經更新課程,杜絕紙上談兵,全企業真實案例結合理論授課,想深入的學習MySQL DBA的知識,可以關注下老男孩教育。


減少InnoDB死結發生的方法有什嗎?MySQL學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.