我们遇到了在cassandra表中写入数据的问题。
流程正在跟随..我们使用一些主键删除XXX
中的所有记录。
然后在循环中插入新的。
execute("DELETE FROM XXX WHERE key = {SOME_UUID}");
for(int i = 0; i < 5; ++i) {
execute("INSERT INTO XXX (key, field1, field2) VALUES ({SOME UUID},'field1','field2')";
}
结果:有时并非所有行都插入到表中。查询表后,我们发现并未插入所有行。
我们拥有的环境:
我们使用DataStax企业版(4.5.2)。卡桑德拉2.0.10。
数据中心有4个节点,我们处理的键空间replication_factor
设置为3。
查询CONSISTENCY_LEVEL
设置为LOCAL_QUORUM
。
java驱动程序是数据stax enterprise 2.1.1
提前致谢。 任何帮助,将不胜感激。
答案 0 :(得分:1)
我假设在你的例子中,删除和插入的SOME_UUID是相同的。
这可能是删除(逻辑删除)和传播到所有节点的新插入(根据您的复制因子)之间的竞争条件。如果删除和插入标记有相同的时间戳,则删除将获胜。您可能会遇到某些节点上删除获胜的情况,而其他节点上的插入获胜。
您可以尝试将RF降低到1,正如@ BryceAtNetwork23建议的那样。
另一个测试是在delete和insert for循环之间的示例代码中插入一个延迟(如500ms)。这将为删除在插入过程之前传播提供时间。
根据您的数据模型,此处的最佳解决方案可能是避免删除。