我想使用批处理语句从我的数据库中删除3个表中的一行,以确保原子性。在所有3个表中,分区键将是相同的。在所有我阅读关于批处理语句的例子中,所有的查询都是针对单个表吗?在我的情况下,使用批处理语句是否是一个好主意?还是应该避免使用它?
我正在使用Cassandra-3.11.2,并使用C ++驱动程序执行我的查询。
我想使用批处理语句从我的数据库中删除3个表中的一行,以确保原子性。在所有3个表中,分区键将是相同的。在所有我阅读关于批处理语句的例子中,所有的查询都是针对单个表吗?在我的情况下,使用批处理语句是否是一个好主意?还是应该避免使用它?
我正在使用Cassandra-3.11.2,并使用C ++驱动程序执行我的查询。
仅应使用多分区批处理来实现对不同表的少量写入的原子性。除此之外,它们应该被避免,因为它们太昂贵了。
可以使用单个分区批处理来实现原子性和隔离性。它们的成本与普通写入相差不大。
但是,由于分区有限,您可以使用多分区LOGGED批处理。
这是一篇关于批处理的非常有用的文档,提供了所有细节。如果您阅读此文档,则所有疑惑都将被解决。
分区键令牌 vs 行分区
表分区和分区键令牌是不同的。分区键用于决定数据所在的节点。对于相同的行键分区令牌相同,因此位于同一节点。对于不同的分区键或相同键的不同表,它们是不同的行变异体。即使对于相同的键,也不能使用一个查询从不同的分区键或不同的表中获取数据。协调员节点必须将其视为不同的请求或变异,并单独从复制的节点请求实际数据。这是 C* 存储数据的内部结构。
每个表甚至都有自己的目录结构,清楚地表明来自一个表的分区永远不会与另一个表的分区交互。
要了解C*如何映射数据,请查看此链接:
是的,根据Cassandra文档,这是BATCH
的一个很好的使用案例。请参阅https://docs.datastax.com/en/dse/6.0/cql/cql/cql_using/useBatchGoodExample.html上的“注意事项”。
如果同一keyspace中有两个不同的表,并且这两个表具有相同的分区键,则此场景被视为单个分区批处理。每个表将有一个单独的变更。这是因为这两个表可能具有不同的列,即使keyspace和分区相同。批处理允许调用者将多个操作捆绑到单个批处理请求中。所有操作都由同一协调器执行。批处理请求的最佳用途是在同一keyspace中的多个表中的单个分区。此外,批处理提供了变更将按特定顺序应用的保证。
具体而言,如果它们具有相同的分区键,则将被视为单个分区批处理。因此:“批处理请求的最佳用途是在同一keyspace中的多个表中的单个分区。”