2015-12-14 47 views
1

Aerospike提供行級鎖定。 (1)此功能可用於實現多記錄操作互斥/鎖定嗎?
(2)推薦?
Aerospike - 實施「批量操作」鎖

示例實現
- 兩個UDF的,一個獲得鎖,一個將其釋放
- 應用程序開始之前必須獲得鎖「操作」
- 鎖記錄可以有TTL的情況下,應用程序無法釋放在一定時間後鎖定 。
- 寫策略執行UDF設置爲「ALL」

-- return true if lock acquisition successful; else return false 
function acquireLock(record, lockBin) 
    if not aerospike:exists(record) then 
     aerospike:create(record) 
    end 

    if record[lockBin] == 1 then 
     return false 
    end 

    record[lockBin] = 1 
    aerospike:update(record) 
    return true 
end 

-- return true if lock release successful, else return false 
function releaseLock(record, lockBin) 
    if not aerospike:exists(record) then 
     return false 
    end 

    if not record[lockBin] == 1 then 
     return false 
    end 

    record[lockBin] = 0 
    aerospike:update(record) 
    return false  
end 
+1

您是否研究過比較和交換(CAS)等樂觀概念或將這些記錄合併爲一個記錄的方法?不建議使用這樣的鎖。這種方法會嚴重限制吞吐量,以每秒更新幾次(最大)。 –

+1

而且最重要的是:鎖不會超過多條記錄,所以您將不得不鎖定兩條記錄,因此必須面對各種死鎖場景。總結是:它可能會給你的應用帶來更多的問題,而不是解決問題。 –

+0

(1)感謝CAS提示。我會看一看。 (2)這個鎖會在整個交易中引入可衡量的延遲。但是操作並不是那麼緊湊,所以併發能力應該還是不錯的。 (3)如果所有客戶知道在開始讀取/寫入相關集之前獲得這一個鎖,則只需要一個鎖。通過TTL,任何死鎖情況都應該得到緩解。 (4)幸運的是,我已經能夠重新設計我的模式以避免需要此鎖。 – Aaron

回答

2

總結其他人所做的一些評論:

雖然可能,這實現高度氣餒由於表現不佳。看看Aerospike的比較和交換(CAS)功能來實現類似的功能。