死鎖分析與解決

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

死鎖產生的必要條件:

互斥:併發執行的事務爲了進行必要的隔離保證執行正確,在事務結束前,需要對修改的數據庫記錄持鎖,保證多個事務對相同數據庫記錄串行修改。

請求與保持:已經持有一個資源鎖,等待另一個資源鎖。

不剝奪:已經獲得鎖資源的事務,在執行前,不能強制剝奪,只能完成事務由自己釋放。一般破壞該條件解除死鎖,強制回滾。

循環等待:發生死鎖時,必然存在一個事務,鎖的環形鏈。調整sql順序避免死鎖。

 

MySQL鎖:

加鎖方式:

外部加鎖:

  共享鎖(S):select * from table lock in share mode

  排他鎖(X):select * from table for update

內部加鎖:

  爲了實現ACID特性,有數據庫系統內部自動添加。

 

快照讀:

  Innodb實現多版本控制(MVCC),支持不加鎖快照讀。

  select * from table where 

  保證同一個select結果集是一致的

  不能保證同一事務內部,select語句與其他語句的數據一致性,如果需要,需要通過外部顯示加鎖。

當前讀:

  select...lock in share mode (共享讀鎖)
  select...for update
  update , delete , insert

  當前讀, 讀取的是最新版本, 並且對讀取的記錄加鎖, 阻塞其他事務同時改動相同記錄,避免出現安全問題

  例如,假設要update一條記錄,但是另一個事務已經delete這條數據並且commit了,如果不加鎖就會產生衝突。所以update的時候肯定要是當前讀,得到最新的信息並且鎖定相應的記錄。

 

分析死鎖:show engine innodb status

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章