91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL InnoDB如何應付死鎖

發布時間:2020-08-07 19:21:17 來源:ITPUB博客 閱讀:202 作者:chenfeng 欄目:MySQL數據庫
死鎖是事務處理型數據庫系統的一個經典問題,但是它們并不是很危險的, 除非它們如此地頻繁以至于你根本處理不了幾個事務。 當因死鎖而產生了回滾時,你通常可以在你的應用程序中重新發出一個事務即可。

InnoDB 使用自動地行級鎖定。你可能恰好在插入或刪除單一一條記錄時產生死鎖。 這是因為這些操作并不是真正“原子(atomic)”級的:他們會自動地在鎖定 inserted/deleted 行的索引記錄(可能有幾個)。


可以通過下面所示的技巧來應付死鎖或減少死鎖的次數: 

MySQL >=3.23.52 和 >= 4.0.3 的版本中使用 SHOW INNODB STATUS 來確定引起最后一個死鎖的原因。這可以幫助你調整你的應用程序來避免死鎖。 
總是準備在因死鎖而發生錯誤時重新發出一個事務。死鎖并不危險。僅僅只需重試一遍。 
經常提交你的事務。小的事務有較少的碰撞可能。 
如果使用鎖定讀取 SELECT ... FOR UPDATE 或 ... LOCK IN SHARE MODE,盡量使用較低的隔離級 READ COMMITTED。 
以一個固定秩序(a fixed order)訪問你的表和記錄。這樣事務將形成一個較精細的隊列,而避免死鎖。 
為你的表添加合適的索引。那么你的查詢只需要掃描較少的索引,因而設置較少的鎖定。使用 EXPLAIN SELECT 來確定 MySQL 為你的查詢挑選的適當的索引。 
盡量少用鎖定:如果可以通過一個 SELECT 在一個較老的數據快照中獲得所需數據,就不要再添加子句 FOR UPDATE 或 LOCK IN SHARE MODE 。在這時使用 READ COMMITTED 隔離級是較好的主意,因為在同一個事務中的每個 consistent read 只讀取它最先確定的數據快照。 
如果仍然沒有什么補救效果,使用表級鎖定連載你的事務(serialize transactions):LOCK TABLES t1 WRITE, t2 READ, ... ; [do something with tables t1 and t2 here]; UNLOCK TABLES。表級鎖定可以使你的事務形成精細的隊列。注意 LOCK TABLES 隱含地啟動一個事務,就如同命令 BEGIN,UNLOCK TABLES 如同 COMMIT 一樣隱含地結束一個事務。 
連載事務(serialize transactions)的另一個解決辦法就是建立一個僅有一行記錄的輔助“信號量(semaphore)” 表。每一個事務在訪問其它表之前均更新這個記錄。通過這種方式所有的事務將持續執行。注意同時 InnoDB 實時死鎖檢測算法也在工作著,因為這個持續鎖定(serializing lock)是一個行鎖定。在 MySQL 中對于表級鎖定我們必須采取超時方式。 


死鎖檢測與回滾
InnoDB 會自動檢測一個事務的死鎖并回滾一個或多個事務來防止死鎖。從 4.0.5 版開始,InnoDB 將設法提取小的事務來進行回滾。一個事務的大小由它所插入(insert)、更新(update)和刪除(delete)的數據行數決定。 Previous to 4.0.5, InnoDB always rolled back the transaction whose lock request was the last one to build a deadlock, that is, a cycle in the waits-for graph of transactions.

InnoDB 不能檢測出由 MySQL 的 LOCK TABLES 語句引起的死鎖,或其它的表類型中的鎖定所引起的死鎖。你不得不通過在 my.cnf 中設置 innodb_lock_wait_timeout 參數來解決這些情形。

當 InnoDB 執行一個事務完整的回滾,這個事務所有所加的鎖將被釋放。然而,如果只一句的 SQL 語句因結果返回錯誤而進行回滾的,由這條 SQL 語句所設置的鎖定可能會被保持。這是因為 InnoDB r的行鎖存儲格式無法知道鎖定是由哪個 SQL 語句所設置。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴青县| 怀仁县| 诸城市| 南岸区| 陕西省| 本溪市| 白山市| 滨海县| 荆门市| 怀远县| 台北县| 藁城市| 乌鲁木齐县| 东乡| 西昌市| 梁平县| 新乡县| 蓬莱市| 太谷县| 随州市| 罗城| 新和县| 塘沽区| 手机| 鄂伦春自治旗| 大渡口区| 佛山市| 始兴县| 昆山市| 镇坪县| 田林县| 庆安县| 萨嘎县| 澄迈县| 全椒县| 高邑县| 无棣县| 通渭县| 虹口区| 独山县| 科技|