1. 程式人生 > >資料庫死鎖及解決方法

資料庫死鎖及解決方法

死鎖的概念:

  死鎖是指兩個或者兩個以上的事務在執行過程中,因爭奪鎖資源而造成的一種互相等待的現象。

死鎖的處理機制:

 解決死鎖最有用最簡單的方法是不要有等待,將任何等待都轉化為回滾,並且事務重新開始。但是有可能影響併發效能。
  • 1:超時回滾,即當兩個事務互相等待時,當一個等待時間超過設定的某一閥值的時候,其中一個事務進行回滾,另一個事務就能繼續進行。在InnoDB引擎中,引數innodb_lock_wait_time用來設定超時的時間。
  • 2:wait-for-graph方法:跟超時回滾比起來,這是一種更加主動的死鎖檢測方式。InnoDB引擎也採用這種方式。

wait-for graph圖:

這種方式一般要求資料庫儲存一下兩種資訊:鎖的資訊連結串列和事務等待連結串列。通過這兩條連結串列可以構造出一張圖,而在這個圖中若存在迴路,就代表存在死鎖,因此資源間互相發生等待。在wait-for graph中,事務為圖中的節點。而在圖中,事務T1指向T2邊的定義為:
  1. 事務T1等待事務T2所佔用的資源
  2. 事務T1最終等待T2所佔用的資源,也就是事務之間在等待相同的資源,而事務T1傳送在事務T2的後面。
示例:
從wait-for graph圖中我們可以發現存在迴路(t1,t2),因此存在死鎖。