2012-03-27 27 views
2

是否有一些時間戳/計數器可用於驗證在讀取 - 修改 - 寫入週期中,行中的數據在讀取和修改之間沒有變化?寫給Cassandra時可以檢測到衝突嗎?

換句話說,我可以讀某種ID的同時讀取行,當我寫回來告訴卡桑德拉什麼ID是,然後寫入失敗,如果ID,因爲再變? (這等於說,其他一些寫了地方,我讀出的數據後)

回答

2

在卡桑德拉每一列是一個包含名稱,值和時間戳的元組(或三重)。該列的時間戳代表最後一次修改時間。如果你有100個節點,無論哪個節點有最新的時間戳更新都會獲勝。這就是Eventual Consistency的實現方式。

zznate具有良好的演示:Introduction to Apache Cassandra for Java Developers哪裏這個話題被引用(幻燈片37)

Accessing timestamp of a Cassandra column

總之,當你需要檢索的能力,你並不需要「某種ID的」代表最後一次修改時間的給定列的時間戳。但是,在規模上,有100多個節點,您如何確保您連接的節點具有最新的列? (參見回zznate演示)

的一點是,你不能,不使交易:

  1. Cassandra - transaction support
  2. Cassandra Transaction with ZooKeeper - Does this work?
  3. how to integrate cassandra with zookeeper to support transactions
  4. 還有更多:cassandra & transactions
+0

我不完全確定我明白。你說的是每個列都有「ID」(時間戳)。因此,如果讀取數據,將所有「列」的時間戳記記錄爲*輸入*,並且當我將修改後的數據寫回時,要求Cassandra檢查那些時間戳沒有改變,然後我會得到我想要的,假設API會允許的。但是你說這是行不通的。是否因爲即使節點具有來自相同插入/更新的相同數據,不同的節點也會有不同的時間戳?這是唯一會使它*不可能*,恕我直言。否則,這只是一個「缺失的功能」。 – 2012-03-28 10:34:48

+0

(點擊最大註釋大小)我瞭解到修改是在一行*內的事務*。這是我所要求的。讀取*一個*行,修改它,並更新*同一行*,確保它沒有改變,如果失敗則失敗。這是否會使一半人會接受這種改變,其他人不會這樣做,從而導致數據變得不一致?這可能是你所期望的問題。 – 2012-03-28 10:39:30

+0

是的。你是對的。節點A可能有A列,時間戳爲xxxxyyyy,當您查詢它時,它是正確的 - 但是,節點Z也有A列,時間戳爲xxxxyyyz(較新),但該變更尚未完全傳播到其他節點它需要基於指定的複製因子 – sdolgy 2012-03-28 10:40:00