Cassandra批量语句-执行顺序

7

我有一个Cassandra的批处理语句,其中包含相同分区键的删除和插入语句,其中删除是第一条语句,插入是第二条语句。批处理语句如何执行这些语句?它们执行的顺序是我们添加语句的顺序吗?

1个回答

10
不,它不会按照指定的顺序执行。要强制执行特定的执行顺序,您可以添加“USING TIMESTAMP”子句。有关详细信息,请查看文档:http://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html
是的。 我将结合上面链接和DELETE文档中的示例进行演示,并从创建一个名为“purchases”的简单表格开始,该表格具有两个字段:
CREATE TABLE purchases (user text PRIMARY KEY, balance bigint);

接下来,我将执行一个包含INSERT和DELETE操作的批处理。我会先执行INSERT,再执行DELETE,但是DELETE的时间戳会比INSERT早:

BEGIN BATCH
  INSERT INTO purchases (user, balance) VALUES ('user1', -8) USING TIMESTAMP 1432043350384;
  DELETE FROM purchases USING TIMESTAMP 1432043345243 WHERE user='user1';
APPLY BATCH;

当我查询userid时:

aploetz@cqlsh:stackoverflow2> SELECT user, balance, writetime(balance) FROM purchases WHERE user='user1';

 user  | balance | writetime(balance)
-------+---------+--------------------
 user1 |      -8 |      1432043350384

(1 rows)

正如您所看到的,INSERT操作被持久化,因为它具有最新的时间戳。如果我只是简单地从cqlsh提示符中运行INSERT和DELETE(按照这个顺序),那么查询将没有返回结果。


在您的“BATCH”示例中,假设您省略了时间戳,Cassandra会保证删除“user1”的行吗?如果它们具有相同的时间戳(在此情况下由服务器计算),哪个优先级更高? - Sotirios Delimanolis
前往此处。墓碑标记始终优先于常规列。也在此处有描述。 - Sotirios Delimanolis
@SotiriosDelimanolis 我喜欢第一个链接中“超越愚蠢”的评论 :) - Zheng Liu
这些是批处理语句中解决冲突的规则:
  1. 如果时间戳不同,则选择具有最大时间戳的列(该值为常规列或墓碑)。
  2. 如果时间戳相同,并且其中一个列是墓碑('null'),则选择墓碑。
  3. 如果时间戳相同,并且没有列是墓碑,则选择具有最大值的列。
参考:https://issues.apache.org/jira/browse/CASSANDRA-6426?focusedCommentId=13836059&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-13836059
- tainguyentt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接