如何減少鎖沖突
1. 對Myisam 類型的表:
1) Myisam 類型的表可以考慮通過改成Innodb 類型的表來減少鎖沖突。
2) 根據應用的情況,嘗試橫向拆分成多個表或者改成Myisam 分區對減少鎖沖突也會有一定的幫助。
2. 對Innodb 類型的表:
1) 首先要確認,在對表獲取行鎖的時候,要盡量的使用索引檢索紀錄,如果沒有使用索引訪問,那麼即便你只是要更新其中的一行紀錄,也是全表鎖定的。要確保sql是使用索引來訪問紀錄的,必要的時候,請使用explain 檢查sql 的執行計劃,判斷是否按照預期使用了索引。
2) 由於MySQL 的行鎖是針對索引加的鎖,不是針對紀錄加的鎖,所以雖然是訪問不同行的紀錄,但是如果是相同的索引鍵,是會被加鎖的。應用設計的時候也要注意,這裡和Oracle 有比較大的不同。
3) 當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,當表有主鍵或者唯一索引的時候,不是必須使用主鍵或者唯一索引鎖定紀錄,其他普通索引同樣可以用來檢索紀錄,並只鎖定符合條件的行。
4) 用SHOW INNODB STATUS 來確定最後一個死鎖的原因。查詢的結果中,包括死鎖的事務的詳細信息,包括執行的SQL 語句的內容,每個線程已經獲得了什麼鎖,在等待什麼鎖,以及最後是哪個線程被回滾。詳細的分析死鎖產生的原因,可以通過改進程序有效的避免死鎖的產生。
5) 如果應用並不介意死鎖的出現,那麼可以在應用中對發現的死鎖進行處理。
6) 確定更合理的事務大小,小事務更少地傾向於沖突。
7) 如果你正使用鎖定讀,(SELECT ... FOR UPDATE 或... LOCK IN SHARE MODE),試著用更低的隔離級別,比如READ COMMITTED。
8) 以固定的順序訪問你的表和行。則事務形成良好定義的查詢並且沒有死鎖。