之前的例子**只是測試**,只是為了說明原理,例子本身很簡單,所以有一些考慮不周的地方。比如當獲取到鎖之後在業務操作執行過程中發生了環境問題導致斷開了和redis的連線,那就無法在finally塊中釋放鎖,導致其他等待獲取鎖的執行緒無限等待下去,也就是發生了死鎖現象。
解決方式:
可以在redis中給鎖設定乙個過期時間,這樣即便無法釋放鎖,鎖也能在一段時間後自動釋放。
**上只需要在獲取到鎖之後在try語句塊中加入如下**:
jedis.expire(key, 10); //這裡給鎖設定10秒的過期時間
更妥善的解決方式:
第乙個解決方式並不是很好,因為當業務操作處理時間很長,超過了設定的過期時間,那鎖就自動釋放了,然後再執行finally塊中釋放鎖的操作時,這個鎖可能已經被其他執行緒所持有,會導致把其他執行緒持有的鎖給釋放了,從而導致併發問題。所以更妥善一點的方式是在釋放鎖時判斷一下鎖是否已經過期,如果已經過期就不用再釋放了。
**上把獲取到鎖之後的操作改為如下**:
long start = system.currenttimemillis( //獲取起始時間毫秒數
tryfinally
}---------------------
死鎖與解決死鎖
要是以後寫資料庫的產品,不是寫sql語句,那裡面涉及到的鎖就跟多了。故事裡有五個哲學家 這些哲學家很窮,只買得起五根筷子。他們坐成一圈,兩個人的中間放一根筷子。哲學家吃飯的時候必須同時得到左手邊和右手邊的筷子。如果他身邊的任何一位正在使用筷子,那他只有等著。假設哲學家的編號是a b c d e,筷子...
oracle解決死鎖
第一步 檢視是否有死鎖存在,查出有資料則代表有死鎖 select p.spid,c.object name,b.session id,b.oracle username,b.os user name from v process p,v session a,v locked object b,all...
Windows Oracle解決死鎖
背景 執行某個查詢功能,無返回無報錯,再次請求時出現死鎖異常。導致後台和其他相關的後台服務無法對該錶進行任何操作。1 查詢導致死鎖的session和object name 被鎖死的表 select l.session id,o.owner,o.object name from v locked ob...