搜尋
首頁資料庫mysql教程mysql死鎖的原因和處理方法是什麼

當多個事務同時持有和請求同一資源上的鎖而產生循環依賴的時候就產生了死鎖,解決方法為:1、用更低的隔離級別;2、以固定的順序存取你的表和行;3、添加精心選定的索引到表中;4、使用更少的鎖定。

mysql死鎖的原因和處理方法是什麼

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

當多個事務同時持有和請求同一資源上的鎖而產生循環依賴的時候就產生了死鎖。死鎖發生在事務試圖以不同的順序鎖定資源。以StockPrice表上的兩個交易為例:

交易1

START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;

交易#2

START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET;
COMMIT;

如果不走運的話,每個交易都可以執行完第一個語句,並在過程中鎖住資源。然後每個事務都試圖去執行第二行語句,當時卻發現它被鎖住了。兩個事務將永遠的等待對方完成,除非有其他原因打斷死鎖。

為了解決這個問題,資料庫實作了各種死鎖探查和逾時機制。像InnoDB這樣複雜的儲存引擎會提示循環依賴並且立即傳回錯誤。否則死鎖將會導致查詢非常緩慢。其他一些不好的做法是等待超時後放棄。目前InnoDB處理死鎖的方式是回滾持有最少排他行級鎖的事務。 (幾乎最簡單的回滾的參考指標)

鎖定的行為是順序是儲存引擎決定的。因此,一些儲存引擎可能會在特定的操作順序下發生死鎖,其他的可能沒有。死鎖有兩種:有些是因為實際資料衝突而無法避免,有些是因為儲存引擎的工作方式產生。

只有部分或完全回滾其中的一個交易才可能打破死鎖。死鎖是事務系統中客觀存在的事實,你的應該在設計上必須考慮處理死鎖。有些業務系統可以從頭重試事務。

如何處理死鎖
死鎖是事務型資料庫典型的問題,但是除非它們頻繁出現以至於你更本來不能運行某個事務,它們一般是不危險的。正常地,你必須編寫你的應用程式使得它們總是準備如果因為死鎖而回滾一個事務就重新發出一個事務。

InnoDB使用自動行級鎖定。即使在只插入或刪除單一行的交易的情況下,你可以遇到死鎖。這是因為這些操作不是真正的“極小的”,它們自動對插入或刪除的行的(可能是數個)索引記錄設定鎖定。

你可以用下列技術對付死鎖減少它們發生的可能性:

用Use SHOW INNODB STATUS來確定最後一個死鎖的原因。這樣可以幫助你調節應用程式來避免死鎖。

總是準備著重新發出事務,如果它因為死鎖而失敗了。死鎖不危險,再試一次。

經常提交你的事務。小事務更少傾向於衝突。

如果你正在使用鎖定讀,(SELECT ... FOR UPDATE或 ... LOCK IN SHARE MODE),試著用更低的隔離級別,例如READ COMMITTED。

以固定的順序存取你的表格和行。則事務形成良好定義的查詢並且沒有死鎖。

將精心選定的索引新增到你的表。則你的查詢需要掃描更少的索引記錄並且因此設定更少的鎖定。使用EXPLAIN SELECT來決定對於你的查詢,MySQL認為哪個索引是最適當的。

使用更少的鎖定。如果你可以接受允許一個SELECT從一個舊的快照返回數據,不要給它添加FOR UPDATE或LOCK IN SHARE MODE子句。這裡使用READ COMMITTED隔離等級是比較好的,因為每個在同一事務裡的持續讀取從它自己新鮮的快照讀取。

如果沒有別的有幫助的了,用表級鎖定係列化你的事務。用LOCK TABLES對事務型表(如InnoDB)的正確方法是設定AUTOCOMMIT = 0 並且不呼叫UNLOCK TABLES直到你明確地提交了事務。例如,如果你需要寫表t1並從表t讀,你可以按如下做:

SET AUTOCOMMIT=0;

LOCK TABLES t1 WRITE, t2 READ, ...;

[do something with tables t1 and t2 here];

COMMIT;

UNLOCK TABLES;

表級鎖定使得你的事務很好地排隊,並且死鎖被避免了。

領一個系列化交易的方法是建立一個輔助的「semaphore」 表,它只包含一個單行。讓每個事務在訪問其它表之前更新那個行。以這種方式,所有事務以序列的方式發生。請注意,InnoDB即時死鎖偵測演算法也能在這種情況下起租用,因為系列化鎖定是行級鎖定。超時方法,用MySQL表級鎖定,必須用來解決死鎖。

在應用程式中使用LOCK TABLES指令,如果AUTOCOMMIT=1,MySQL不設定InnoDB表鎖定。

相關推薦:《mysql教學

###

以上是mysql死鎖的原因和處理方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL如何處理數據複製?MySQL如何處理數據複製?Apr 28, 2025 am 12:25 AM

MySQL通過異步、半同步和組複製三種模式處理數據複製。 1)異步複製性能高但可能丟失數據。 2)半同步複製提高數據安全性但增加延遲。 3)組複製支持多主複製和故障轉移,適用於高可用性需求。

您如何使用解釋性語句分析查詢性能?您如何使用解釋性語句分析查詢性能?Apr 28, 2025 am 12:24 AM

EXPLAIN語句可用於分析和提升SQL查詢性能。 1.執行EXPLAIN語句查看查詢計劃。 2.分析輸出結果,關注訪問類型、索引使用情況和JOIN順序。 3.根據分析結果,創建或調整索引,優化JOIN操作,避免全表掃描,以提升查詢效率。

您如何備份並還原MySQL數據庫?您如何備份並還原MySQL數據庫?Apr 28, 2025 am 12:23 AM

使用mysqldump進行邏輯備份和MySQLEnterpriseBackup進行熱備份是備份MySQL數據庫的有效方法。 1.使用mysqldump備份數據庫:mysqldump-uroot-pmydatabase>mydatabase_backup.sql。 2.使用MySQLEnterpriseBackup進行熱備份:mysqlbackup--user=root--password=password--backup-dir=/path/to/backupbackup。恢復時,使用相應的命

MySQL中慢速查詢的常見原因是什麼?MySQL中慢速查詢的常見原因是什麼?Apr 28, 2025 am 12:18 AM

MySQL慢查詢的主要原因包括索引缺失或不當使用、查詢複雜度、數據量過大和硬件資源不足。優化建議包括:1.創建合適的索引;2.優化查詢語句;3.使用分錶分區技術;4.適當升級硬件。

MySQL中有什麼看法?MySQL中有什麼看法?Apr 28, 2025 am 12:04 AM

MySQL視圖是基於SQL查詢結果的虛擬表,不存儲數據。 1)視圖簡化複雜查詢,2)增強數據安全性,3)維護數據一致性。視圖是數據庫中的存儲查詢,可像表一樣使用,但數據動態生成。

MySQL和其他SQL方言之間的語法有什麼區別?MySQL和其他SQL方言之間的語法有什麼區別?Apr 27, 2025 am 12:26 AM

mysqldiffersfromothersqldialectsinsyntaxforlimit,自動啟動,弦樂範圍,子征服和表面上分析。 1)MySqluessLipslimit,whilesqlserverusestopopandoraclesrontersrontsrontsrontsronnum.2)

什麼是mysql分區?什麼是mysql分區?Apr 27, 2025 am 12:23 AM

MySQL分區能提升性能和簡化維護。 1)通過按特定標準(如日期範圍)將大表分成小塊,2)物理上將數據分成獨立文件,3)查詢時MySQL可專注於相關分區,4)查詢優化器可跳過不相關分區,5)選擇合適的分區策略並定期維護是關鍵。

您如何在MySQL中授予和撤銷特權?您如何在MySQL中授予和撤銷特權?Apr 27, 2025 am 12:21 AM

在MySQL中,如何授予和撤銷權限? 1.使用GRANT語句授予權限,如GRANTALLPRIVILEGESONdatabase_name.TO'username'@'host';2.使用REVOKE語句撤銷權限,如REVOKEALLPRIVILEGESONdatabase_name.FROM'username'@'host',確保及時溝通權限變更。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具