一、什麼是死鎖,產生死鎖的緣由,和產生死鎖的必要條件數據庫
所謂死鎖(DeadLock),是指多個進程或線程在運行過程當中因爭奪資源而形成的一種僵局,當進程或線程處於僵局時,若無外力做用,它們將沒法再向前推動。多線程
緣由:1)競爭資源 2)推動順序不合法性能
必要條件:1)互斥條件 2)請求與保持條件 3)不剝奪條件 4)環路等待條件url
以上參考計算機操做系統第三版 操作系統
二、資源競爭,好比公共類對象、文件讀寫、數據庫操做等。線程
場景:多線程抓取url內容,每條url抓取狀態存儲在數據庫中,沒有抓取,正在抓取,已經抓取。對象
多個線程去數據庫中取狀態爲沒有抓取的url進行抓取,直到全部的url狀態都爲正在抓取,已經抓取。看上去好像沒什麼問題,可是發生了不一樣的線程操做同一個url資源的問題,實際上是由於獲取url到開始下載url內容。這段時間 是有延遲的,所以,url抓取狀態不會及時的改變。這樣就致使數據庫數據行死鎖。 進程
三、解決方案資源
暫時想到的解決方案: 下載
1)給數據庫數據加行級鎖,不再用擔憂多人操做了,可是大大下降了數據庫查詢和修改性能。
2)合理的劃分任務,每一個線程只作本身的事情,不相互競爭url資源,這下既考慮到數據庫性能,又解決了資源競爭的問題。