我想使用批处理语句从我的数据库中的3个表中删除一行以确保原子性。所有3个表中的分区键都是相同的。在我读到的关于批处理语句的所有示例中,所有查询都是针对单个表的?就我而言,使用批处理语句是个好主意吗?或者,我应该避免吗?
我正在使用Cassandra-3.11.2并使用C ++驱动程序执行查询。
答案 0 :(得分:3)
是的,您可以使用批处理来确保原子性。单个分区批处理更快(相同的表和相同的分区键),但仅限于有限数量的分区(在您的情况下为三个),这是可以的。但是不要将它用于性能优化(例如:减少多个请求)。如果你需要原子性,你可以使用它。
您可以查看以下链接:
Cassandra batch query performance on tables having different partition keys
Cassandra batch query vs single insert performance
How single parition batch in cassandra function for multiple column update?
<强> EDITED 强>
就我而言,表格不同,但所有3个表格中的分区键都相同。那么这是单个分区批处理的特殊情况还是完全不同的东西。
对于不同的表,分区也不同。所以这是一个多分区批处理。 LOGGED 批处理用于确保不同分区(不同表或不同分区键)的原子性。 UNLOGGED 批次用于确保单个分区批处理的原子性和隔离。如果对多分区使用 UNLOGGED 批处理,将无法确保批处理原子性。默认为 LOGGED 批次。对于单个分区批处理,默认为 UNLOGGED 。导致单个分区批处理被视为单行突变。对于单行更新,无需使用 LOGGED 批处理。要了解 LOGGED 或 UNLOGGED 批次,我在下面分享了一个链接。
多分区批处理应仅用于实现不同表上的一些写入的原子性。除此之外,他们应该避免,因为他们太贵了。
单个分区批次可用于实现原子性和隔离。它们并不比普通的写作贵得多。
但是您可以使用多分区 LOGGED 批处理,因为分区是有限的。
一个非常有用的批量文档,并提供了所有细节。如果你读到这个,所有的混淆都将被清除。
Cassandra - to BATCH or not to BATCH
分区密钥令牌与行分区
表分区和分区键令牌是不同的。分区键用于决定数据所在的节点。对于相同的行密钥分区令牌是相同的,因此驻留在同一节点中。对于不同的分区键或相同的键不同的表,它们是不同的行变异。即使对于相同的密钥,也无法通过一个查询获取不同分区键或不同表的数据。协调器节点必须将其视为不同的请求或变异,并分别从复制节点请求实际数据。它是C *如何存储数据的内部结构。
每个表甚至都有自己的目录结构,清楚地表明一个表中的分区永远不会与另一个表的分区交互。
Does the same partition key in different cassandra tables add up to cell theoretical limit?
要了解C *如何映射数据的详细信息,请查看此链接:
Understanding How CQL3 Maps to Cassandra's Internal Data Structure