Mysql如何避免死鎖

2021-10-08 14:21:34 字數 1494 閱讀 2724

這裡為各位讀者介紹一些在innodb引擎使用過程中減少死鎖的建議。

正確使用讀操作語句

經過之前文章介紹,我們知道一般的快照讀是不會給資料表任何鎖的。那麼這些快照讀操作也就不涉及到參與任何鎖等待的情況。那麼對於類似insert…select這樣需要做當前讀操作的語句(但又不是必須進行當前讀的操作),筆者的建議是盡可能避免使用它們,如果非要進行也最好放到資料庫操作的非高峰期進行(例如晚間)。

基於索引進行寫操作,避免基於表掃瞄(聚集索引掃瞄)進行寫操作

基於索引進行寫操作的目的是保證乙個寫操作性質的事務中,被鎖住的索引和需要請求的鎖定資源被控制在最小範圍內。而避免使用表鎖的原因是保證乙個寫操作性質的事務中,不會額外鎖住完全不需要的索引資源或者搶占完全不需要的索引資源。表鎖雖然不會直接導致死鎖,但是由於表鎖的工作方式,導致它成為死鎖原因的機率增大了。

避免索引失效

使用索引一定要注意索引欄位的型別,例如當字段是乙個varchar型別,賦值卻是乙個int型別,就會導致索引失效。如下所示:

explain select * from myuser where user_name =

1# user_name 欄位的型別是varchar,該欄位建立了乙個非唯一鍵索引

# 但是以上語句在使用字段進行檢索時,卻使用了乙個int作為條件值。

# 通過mysql的執行計畫可以看到,innodb引擎在執行查詢時並未使用索引,而是走的全表掃瞄+--

--+----

----

-----+

-------

+------+--

----

----

-----+

-----+

------+

----

----

-----+

| id | select_type | table | type | possible_keys | key | rows | extra |+--

--+----

----

-----+

-------

+------+--

----

----

-----+

-----+

------+

----

----

-----+

|1| ****** | myuser| all | name_index ||13

| using where |+--

--+----

----

-----+

-------

+------+--

----

----

-----+

-----+

------+

----

----

----

-+

如何避免mysql死鎖

1.經常提交你的事務,小事務更少的傾向於衝突 2.以固定的順序訪問你的表和行,這樣事務就會形成良好的查詢並且沒有思索 3.講精心選定的索引新增到你的表中,這樣你的查詢就只需要掃瞄更少的索引記錄,並且因此可以設定更好的鎖定 4.不要把無關緊要的操作放到事務裡面 5.盡量按照主鍵索引去查詢記錄,範圍查詢...

如何避免死鎖

如何避免死鎖 1 使用事務時,盡量縮短事務的邏輯處理過程,及早提交或回滾事務 2 設定死鎖超時引數為合理範圍,如 3分鐘 10分種 超過時間,自動放棄本次操作,避免程序懸掛 3 優化程式,檢查並避免死鎖現象出現 4 對所有的指令碼和sp都要仔細測試,在正是版本之前。5 所有的sp都要有錯誤處理 通過...

如何避免死鎖

什麼是死鎖,如何避免死鎖?執行緒a需要資源x,而執行緒b需要資源y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖 deadlock 或死亡擁抱 the deadly embrace 在併發程式設計中,死鎖 deadlock 是一種十分常見的邏輯錯誤。通過採用正確的程式設計方式,死鎖的發生不難避免。...