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

z4bn682m  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(396)

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按顺序执行查询?

f2uvfpb9

f2uvfpb91#

由于cassandra的分布式特性,不同的节点可以接收cassandra中的查询,并且根据特定节点上的负载,可能是一些稍后发送的查询执行得更早。在您的情况下,您可以将第一个insert放入批处理本身。或者,在某些驱动程序(例如java驱动程序)中实现,使用白名单策略只向一个节点发送查询—但在这种情况下,这将成为瓶颈(我真的不确定你的驱动程序是否有这样的功能)。

相关问题