Cassandra并不意味着语句执行的特定顺序



Cassandra并不意味着语句执行的特定顺序。

执行下面代码这样的语句不会按顺序执行。

INSERT INTO channel 
JSON ''{"cuid":"NQAA0WAL6drA"
,"owner":"123"
,"status":"open"
,"post_count":0
,"mem_count":1
,"link":"FWsA609l2Og1AADRYODkzNjE2MTIyOTE="
, "create_at":"1543328307953"}}'';
BEGIN BATCH 
UPDATE channel 
SET title = ? , description = ?  WHERE cuid = ? ;
INSERT INTO channel_subscriber 
JSON ''{"cuid":"NQAA0WAL6drA"
,"user_id":"123"
,"status":"subscribed"
,"priority":"owner"
,"mute":false
,"setting":{"create_at":"1543328307956"}}'';
APPLY BATCH ;

根据system_traces.sessions,它们中的每一个都由不同的节点接收。

有时两个查询中的started_at时间相等(以毫秒为单位(,有时第二个查询的started_at时间小于第一个查询。因此,这破坏了语句和数据的顺序。

我们使用erlang,marina驱动程序,一致性级别为QUORUM,所有cassandra节点和应用服务器的时间都是同步的。

如何强制Cassandra按顺序执行查询?

由于分布式的特性,Cassandra中的查询可能会被不同的节点接收,并且根据特定节点上的负载,可能会有一些稍后发送的查询被提前执行。在您的情况下,您可以将第一个插入放入批次本身。或者,正如它在一些驱动程序(例如Java驱动程序(中实现的那样,使用白名单策略只向一个节点发送查询,但在这种情况下,这将是瓶颈。(我真的不确定你的驱动程序是否具有这样的功能(。

最新更新