什麼是死鎖?
進程的加鎖請求會被鎖衝突阻塞,從而進入睡眠等待狀態。
而如果出現了多個進程持有、且等待其他進程釋放資源的惡性環,即形成死鎖。
可以簡單地將死鎖理解爲:存在資源爭奪的惡性環。
舉個栗子:
假設有n個人,圍着圓桌坐了一圈。每個人左手都拿着一個饅頭,且都用右手去搶自己右手邊人手裏的饅頭。結果誰都把饅頭喫不到嘴裏!
postgre中的死鎖預防
“持有者靠前”
當進程請求加鎖時,如果失敗,會進入等待隊列。如果在隊列中已經存在一些進程要求本進程中已經持有的鎖,那麼爲了儘量避免死鎖,可以簡單地把本進程插入到它們的前面。
“先到先處理”
當一個鎖被釋放時,將會試圖喚醒等待隊列中的進程。如果其中的某個進程的要求與排在它前面但由於某些原因不能被喚醒的進程衝突,這個進程將不被喚醒。這麼做可以保證互相沖突的加鎖請求按照到達的先後被處理。