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 ;
根据systemtraces.sessions,它们中的每一个都由不同的节点接收。
有时 started_at
两个查询中的时间相等(毫秒),有时 started_at
第二次查询的时间小于第一次查询的时间。所以,这破坏了语句和数据的顺序。
我们使用erlang,marina驱动,一致性级别是quorum,所有cassandra节点和应用服务器的时间是同步的。
如何强制cassandra按顺序执行查询?
1条答案
按热度按时间f2uvfpb91#
由于cassandra的分布式特性,不同的节点可以接收cassandra中的查询,并且根据特定节点上的负载,可能是一些稍后发送的查询执行得更早。在您的情况下,您可以将第一个insert放入批处理本身。或者,在某些驱动程序(例如java驱动程序)中实现,使用白名单策略只向一个节点发送查询—但在这种情况下,这将成为瓶颈(我真的不确定你的驱动程序是否有这样的功能)。