mysql 壓力 死 MySQL死鎖

2021-10-17 20:25:27 字數 1317 閱讀 1025

死鎖產生

死鎖是指兩個或多個事務在同一資源上相互占用,並請求鎖定對方占用的資源,從而導致惡性迴圈。

當事務試圖以不同的順序鎖定資源時,就可能產生死鎖。多個事務同時鎖定同乙個資源時也可能會產生死鎖。

檢測死鎖

資料庫系統實現了各種死鎖檢測和死鎖超時的機制。innodb儲存引擎能檢測到死鎖的迴圈依賴並立即返回乙個錯誤。

死鎖恢復

死鎖發生以後,只有部分或完全回滾其中乙個事務,才能打破死鎖,innodb目前處理死鎖的方法是,將持有最少行級排他鎖的事務進行回滾。所以事務型應用程式在設計時必須考慮如何處理死鎖,多數情況下只需要重新執行因死鎖回滾的事務即可。

外部鎖的死鎖檢測

發生死鎖後,innodb 一般都能自動檢測到,並使乙個事務釋放鎖並回退,另乙個事務獲得鎖,繼續完成事務。但在涉及外部鎖,或涉及表鎖的情況下,innodb 並不能完全自動檢測到死鎖, 這需要通過設定鎖等待超時引數 innodb_lock_wait_timeout 來解決

死鎖影響效能

死鎖會影響效能而不是會產生嚴重錯誤,因為innodb會自動檢測死鎖狀況並回滾其中乙個受影響的事務。在高併發系統上,當許多執行緒等待同乙個鎖時,死鎖檢測可能導致速度變慢。 有時當發生死鎖時,禁用死鎖檢測(使用innodb_deadlock_detect配置選項)可能會更有效,這時可以依賴innodb_lock_wait_timeout設定進行事務回滾。

myisam避免死鎖

在自動加鎖的情況下,myisam 總是一次獲得 sql 語句所需要的全部鎖,所以 myisam 表不會出現死鎖。

innodb避免死鎖 為了在單個innodb表上執行多個併發寫入操作時避免死鎖,可以在事務開始時通過為預期要修改的每個元祖(行)使用select ... for update語句來獲取必要的鎖,即使這些行的更改語句是在之後才執行的。

在事務中,如果要更新記錄,應該直接申請足夠級別的鎖,即排他鎖,而不應先申請共享鎖、更新時再申請排他鎖,因為這時候當使用者再申請排他鎖時,其他事務可能又已經獲得了相同記錄的共享鎖,從而造成鎖衝突,甚至死鎖

如果事務需要修改或鎖定多個表,則應在每個事務中以相同的順序使用加鎖語句。在應用中,如果不同的程式會併發訪問多個表,應盡量約定以相同的順序來訪問表,這樣可以大大降低產生死鎖的機會

通過select ... lock in share mode獲取行的讀鎖後,如果當前事務再需要對該記錄進行更新操作,則很有可能造成死鎖。

改變事務隔離級別

如果出現死鎖,可以用 show innodb status 命令來確定最後乙個死鎖產生的原因。返回結果中包括死鎖相關事務的詳細資訊,如引發死鎖的 sql 語句,事務已經獲得的鎖,正在等待什麼鎖,以及被回滾的事務等。據此可以分析死鎖產生的原因和改進措施。

mysql沒有事務死鎖 Mysql事務與死鎖

好久沒有寫部落格了,最近工作太忙了,真的是996icu呀。想找個機會跳出來。之後我要做到work life balance!當考慮的就是資料一致性的問題時我們用就應該想到mysql的事務。但是當我們使用事務時會有很多的坑,首先我們了解一下事務的隔離界別。1 事物的隔離級別 資料庫中有四種資料隔離級別...

mysql死鎖後狀態 mysql如何解除死鎖狀態

第一種 前提條件 找到執行非常慢的sql 如何找呢 還原客戶遇到的問題場景,從控制台找到所執行的sql,一句句的去執行,直到找到執行非常慢的sql 1.查詢是否鎖表 show open tables where in use 0 2.查詢程序 如果您有super許可權,您可以看到所有執行緒。否則,您...

死磕mysql 死磕mysql

資料庫建立語句 create database new 建立乙個名為new 的資料庫 drop database new 刪除名為new的資料庫 資料庫名為小寫,當初教我的那個人對我說在某個系統中大寫會出現異常情況,為了方便移植,統一為小寫 show creata database new 檢視建立...