mysql設計死鎖

2021-08-16 23:15:37 字數 1288 閱讀 5542

死鎖是指兩個或多個事務在同一資源上互相占用,並請求加鎖時,而導致的惡性迴圈現象。當多個事務以不同順序試圖加鎖同一資源時,就會產生死鎖。任何時間,多個事務同時加鎖同一資源,一定產生死鎖。例如,設想下列兩個事務同時處理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 也支援表級鎖...