2017-04-26 134 views
0

如果我在Cassandra中有一個List字段,並且有兩個人同時寫入它,那麼它是簡單的最後寫入勝還是將它合併寫入?Cassandra列表類型衝突

例如:[A,B,C,d]
用戶1 - >並[b,A,C,d](b移動到索引0)
用戶2 - > [A,B,d,C ](將c移動到索引3)

卡桑德拉將合併結果並以[b,a,d,c]結尾,還是使用最後一次寫入贏得微秒?

+0

是您使用的查詢來寫? –

+0

還沒有。我只是在研究這項技術。你知道一個合併寫入的文件嗎? – joels

回答

1

您將獲得合併結果

每次寫入數據卡桑德拉,每列相關聯的時間戳也被插入。當您執行讀取查詢時,時間戳用於在單個列或集合元素中選擇「獲勝」更新。

如果我使用相同的時間戳進行真正的併發寫入,該怎麼辦?在不太可能的情況下,您最終會得到兩個時間戳匹配的微秒,您可能會得到一個糟糕的版本,但Cassandra通過比較字節值確保連接一直中斷。

卡桑德拉商店列表(集合)與普通列不同。
實施例:

CREATE TABLE friendlists (
    user text PRIMARY KEY, 
    friends list <text> 
); 

如果我們插入一些僞數據:

user  | friends 
----------+------------------------- 
    john | [doug, patricia, scott] 
patricia |   [john, lucifer] 

內部表示:

RowKey: john 
=> (column=, value=, timestamp=1374687324950000) 
=> (column=friends:26017c10f48711e2801fdf9895e5d0f8, value='doug', timestamp=1374687206993000) 
=> (column=friends:26017c11f48711e2801fdf9895e5d0f8, value='patricia', timestamp=1374687206993000) 
=> (column=friends:26017c12f48711e2801fdf9895e5d0f8, value='scott', timestamp=1374687206993000) 
=> (column=friends:6c504b60f48711e2801fdf9895e5d0f8, value='matt', timestamp=1374687324950000) 
=> (column=friends:6c504b61f48711e2801fdf9895e5d0f8, value='eric', timestamp=1374687324950000) 
------------------- 
RowKey: patricia 
=> (column=, value=, timestamp=1374687352290000) 
=> (column=friends:3b817b80f48711e2801fdf9895e5d0f8, value='john', timestamp=1374687243064000) 

在這裏,因爲一個UUID被附加到內部列名是更復雜CQL字段名稱爲「朋友」。這用於跟蹤列表中項目的順序。

每次插入數據卡珊德拉下面的查詢:

INSERT INTO friendlists (user , friends) VALUES ('patricia', ['john', 'lucifer']); 
//or 
UPDATE friendlists SET friends = ['john', 'lucifer'] where user = 'patricia'; 

將創建一個墓碑比目前少時間戳,它告訴,以前的數據已被刪除。因此,如果併發插入發生在相同的確切時間戳上,那麼兩個數據都在邏輯刪除之前,因此兩個數據都將生效。

來源:
http://mighty-titan.blogspot.com/2012/06/understanding-cassandras-consistency.html http://opensourceconnections.com/blog/2013/07/24/understanding-how-cql3-maps-to-cassandras-internal-data-structure-sets-lists-and-maps/