由於網路延遲造成邏輯鎖過期的問題

volc1606發表於2024-11-12

getLock {
..
網路波動,導致getLock獲取的鎖已過期失效,其他執行緒請求仍然可以執行這段邏輯
...
}

解決方案

redisson watch-dog

try {
    // 嘗試獲取鎖,如果獲取成功,則執行任務
    if (lock.tryLock(acquireTimeout, lockHoldTime, TimeUnit.SECONDS)) {
        try {
            // 執行任務
            // ...
 
            // 注意:由於RLock的自動續期機制,你不需要在這裡手動續期鎖
 
        } finally {
            if (lock != null) {
                // 釋放鎖
                lock.unlock();
            }
        }
    } else {
        // 無法獲取鎖,處理這種情況(例如,重試、記錄日誌、丟擲異常等)
    }
} catch (InterruptedException e) {
    // 處理執行緒被中斷的情況
    Thread.currentThread().interrupt(); // 恢復中斷狀態
    // ...
}

acquireTimeout: 嘗試獲取鎖的最長時間
lockHoldTime: 鎖被持有的時間。如果任務執行時間不確定,你應該將lockHoldTime設定為一個足夠長的時間,以容納任務執行的最大可能時間。但是,請注意不要設定得太長,以避免因為鎖被意外持有而導致的其他問題。

相關文章