2014-12-27 76 views
2

這是我想做的事:檢測couchbase中的鎖定釋放?

try to lock a few documents 
if any lock fails: 
    unlock any docs we've locked so far 
    wait until all locks are cleared 
    retry from beginning 
do something 

不過,我不知道如何有效地等待,直到所有的鎖都被清除。我在couchbase文檔中找不到任何東西,除了使用「無限」循環來檢查鎖定嘗試是否返回臨時失敗錯誤。有沒有什麼好的方法可以在重試之前等待正確的時間? (加上一些隨機時間以避免重複衝突)

在重試之前等待15秒以上並不是真正用戶友好的。

回答

3

沒有直接的。

雖然兩種可能的優化可能會使它更有效一些。

一個是,你可以在應用程序級別有一個方案,如果你無法獲得鎖,你與該服務器上的服務員保持一個記錄,所以只有最上面的一個或兩個嘗試獲取該鎖。

二是你可能應該使用指數退避重試來有效地重試鎖。如果你真的想變得複雜,那麼你可以在最有可能獲得鎖的時候建立和訓練一個圍繞負指數的模型。隨着「截止日期」的臨近,這就是你更頻繁地進行調查的地方,用負指數函數來描述數學。

+0

如果多個服務器競爭鎖定某些文檔,並且它們都失敗,那麼使用指數級地減少等待時間是一個非常糟糕的主意。如果兩者都在同一時間再次嘗試,我們會一遍又一遍地得到同樣的問題。 –

+0

除非他們鎖定在相同的順序,否則他們永遠不會在同一時間。一個會成功,其他人將不得不等待。 –

+0

是的,但是如果它們不以相同的順序鎖定。他們可以分別鎖定「許多」文檔,只有少數文檔被兩個線程鎖定。當他們鎖定相同的文檔時,他們不必執行相同的任務。 –