天天看點

NOSQL(五)版本戳

《NoSQL精粹》讀書筆記,轉載請注明出處《jiq•欽's technical Blog》

“事務”是一個有用的工具,可以保證資料的強一緻性,對于NoSQL不支援事務這一點,很多NoSQL支援者并不擔心,因為面向聚合的NoSQL資料庫中以聚合為機關的資料更新操作是原子的。

1“事務”的局限性

“事務”也有其局限性,有些更新操作無法封裝到一個事務中,因為那會導緻事務的打開時間過長。考慮這樣一個例子,使用者浏覽商品時,看中了一個很便宜的商品,然後選中加入購物車,填入信用卡資訊,寄送位址資訊等,然後再确認送出訂單之前,可能去吃了頓飯,或者去找信用卡去了,在這期間如果商品價格被修改了,或者寄送位址運費計算規則被修改了,那麼送出訂單時計算出來的支付價格将是錯誤的。

這時通過“版本戳”就可以很好地應對。而且在從“單伺服器分布模型”遷移到“多伺服器”時同樣如此。版本戳可以確定在資料的讀取和寫入期間,沒有其他人更新過此資料。這個例子中需要確定在寫入訂單時,沒有人更新過訂單中的商品資訊、運費資訊等。是以在送出訂單時,需要将讀取資料時記錄下來的版本戳資訊和現在資料庫中的版本戳資訊進行對比,若檢測到首次讀取之後到現在一直沒有變化,将正确計算出支付價格。

HTTP協定更新資源時也會用到這種機制。某些資料庫也提供了類似“條件更新”的機制,確定不會再舊資料上執行更新操作,有時也稱作compare-and-set。

2 版本戳建構方法

Ø  計數器

Ø  GUID

Ø  根據資源内容生産HASH碼

Ø  時間戳

3 多伺服器環境生成版本戳

在“單伺服器”或者“主從複制”分布模型中,使用基本的版本戳生成方案就好,在這種情況下可以由主節點生成版本戳,而從節點必須使用主節點的版本戳。

在“對等複制”分布模型中則需要采用更為複雜的版本戳生成方式。

繼續閱讀