方案如下: 我有1个Cassandra节点,其中有一个键空间,其中有2个表。让我们将这些表称为A和B。现在,我有了一个脚本,可以在批处理语句中非常快速地将数据插入这两个表中。表A具有列“ k”和“值”。表B具有列“ k”和“值”。批处理查询如下:
BEGIN BATCH
INSERT INTO A(k, value) VALUES ("a", 1);
INSERT INTO B(k, value) VALUES ("b", 1);
APPLY BATCH
值1会在每个连续的批查询中保持递增。因此,如果表A具有(a,1000),则表B必须具有(b,1000)。因为(记录的)批处理查询是原子的。
现在我的问题是,在这种情况下,nodetool快照如何工作?我已经看过快照的源代码,而且似乎是每个键空间,每个表一个接一个地执行快照的。因此,例如,在时间0处,获取表A的快照,快照中说(“ a”,100),然后在时间1处插入新的批查询(值为101),然后在时间2处, b的快照,这意味着b的快照的值为101,而a则没有。
如果以上解释正确,那么恢复时不会造成问题吗?恢复后,表A如何获得(“ a”,101)?还是还原后表B没有(“ b”,101)?
答案 0 :(得分:0)
首先,原子性和隔离性之间存在细微的界限。批次保证两个插入物 将被应用(原子性),但它们不保证它们将在相同的时间被施加。 (隔离)
客户端在选择中仍然能够读取一个而不读取另一个。此规则的唯一例外是,如果批次针对的是一行。
您说的很对,因为您会遇到所描述的问题。很有可能出现两种表中数字都不相同的情况。