我有一个必须添加到采购订单的产品列表。采购订单具有序列号,一旦添加了产品,就应更改其状态以指示这些产品是否可以购买。
1个采购订单中正在处理的产品的典型数量为500.
在数据库上 - 我有2个表 - > 1表示产品,另一个表示采购订单。这意味着我需要500次更新和1次插入才能完成。 当我尝试在BatchStatement中执行此操作时,我收到错误 - 批处理太大。
各方面的建议告诉我,我应该使用多个异步查询。然而,我担心的是整个行动的原子性。 请根据我的要求建议最佳前进方式。
提前致谢。
答案 0 :(得分:2)
这很有趣。将大量插入(> 10)插入批处理(以实现原子性)实际上将是一个糟糕的性能,因此提高批量限制实际上不是一种选择。
由于Cassandra也管理单行级别的原子性,您可以通过添加一个表来“标记”您的采购订单来改变您的模型,在那里您只将采购订单ID和项目存储在一行中。地图,因此您的查询具有幂等性。然后,您可以展开或发布此表,以根据需要继续您的工作流程。
答案 1 :(得分:1)
然而,我担心的是整个行动的原子性。请根据我的要求建议最佳前进方式。
请注意,Cassandra批次不提供隔离(http://www.datastax.com/dev/blog/atomic-batches-in-cassandra-1-2):
请注意,我们的意思是数据库中的“原子”意味着如果批处理的任何部分成功,则所有部分都将成功。没有暗示其他保证;特别是没有孤立;其他客户将能够从批次中读取第一批更新的行,而其他客户正在进行中。
因此,如果您需要隔离,@ xmas79应答,您应该将产品和采购订单存储在一个表中。
如果隔离和性能不重要,您可以尝试调整Cassandra yaml并增加batch_size_fail_threshold_in_kb
参数的值
任何超过此值的批次都会失败。默认为50kb(10x警告阈值)。