2017-04-26 126 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/