死鎖是指兩個或多個事務在同一資源上互相占用,並請求加鎖時,而導致的惡性迴圈現象。當多個事務以不同順序試圖加鎖同一資源時,就會產生死鎖。任何時間,多個事務同時加鎖同一資源,一定產生死鎖。例如,設想下列兩個事務同時處理stockprice表:
[sql]
view plain
copy
事務1
start transaction
update
stockprice
setclose
=32.30
where
stock_id = 4
anddate
= ' 2002-05-01'
; update
stockprice
setclose
=29.00
where
stock_id = 3
anddate
= '2002-05-02'
; commit
; 事務2
start transaction
; update
stockprice
sethigh = 20.23
where
stock_id = 3
anddate
= '2002-05-02'
; update
stockprice
sethigh = 40.23
where
stock_id = 4
anddate
= '2002-05-01'
; commit
; 如果湊巧,每個事務在處理過程中,都執行了第乙個查詢,更新了資料行,也加鎖了該資料行。接著,每個事務都去試圖更新第二個資料行,卻發現該行已被(對方)加鎖,然後兩個事務都開始互相等待對方完成,陷入等待中,除非外部因素介入,才能解除死鎖。
為了解決這個問題,資料庫系統實現了各種死鎖檢測和死鎖超時機制。對於更複雜的系統,innodb儲存引擎,可以預知迴圈相關性,並立刻返回錯誤。這種解決方式實際很有效,否則死鎖導致很慢的查詢。其他的解決方式,是讓查詢達到乙個鎖等待超時時間,然後再放棄爭用,但這種方法不夠好。
目前innodb處理死鎖的方法是,回滾擁有最少排他行級鎖的事務。
鎖現象和鎖順序是因儲存引擎而異的,某些儲存引擎可能會因為使用某種順序的語句導致死鎖,其他的卻不會。死鎖現象具有雙重性:有些是因真實的資料衝突產生的,無法避免,在些則是因為儲存引擎的工作方式導致的。
如果不以部分或全部的方式回滾某個事務,死鎖將無法解除。在事務性的系統中,這是個無法更改的事實。
mysql 死鎖語句 MySQL死鎖
死鎖產生 行鎖的具體實現演算法有三種 record lock gap lock以及next key lock。record lock是專門對索引項加鎖 gap lock是對索引項之間的間隙加鎖 next key lock則是前面兩種的組合,對索引項及其之間的間隙加鎖。只在可重複讀或以上隔離級別下的特...
mysql事務死鎖 MySQL事務 死鎖
一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...
mysql 死鎖模擬 mysql死鎖示例
mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也支援表級鎖...