在Cassandra中处理多个请求

时间:2017-05-25 11:51:14

标签: cassandra

我正在使用cassandra。

我有两个列族A和B.两个列族都有相同的数据但两者都有不同的主键。现在我使用批处理语句来更新这两个表中的行。

表模式如下:

表A的主键[id1(分区键)id2(分区键)id3(聚类键)]

表B的主键[id1(分区键)id2(分区键)状态(聚类键)id3(聚类键)]

我想更新两个表的状态。状态是B中的簇密钥,在表A中,它是简单的列。

我所做的是从A获取状态并将其视为旧状态。

然后在批处理中我首先删除表A中的行,然后从表B中删除行,在表A中插入新行并在表B中插入新行。

注意:使用从A获取的旧状态,我创建B的主键,然后从B中删除并在B中插入新行。

它工作正常,但对于并行请求则不然。 如果来自2个不同实例的相同主键有2个请求,那么我遇到了问题。表B获取具有旧状态和新状态的两个条目。

那我怎样才能在cassandra中解决这个问题?

1 个答案:

答案 0 :(得分:0)

Cassandra 2.0及更高版本支持轻量级交易。

你有"如果不存在"插入时的状况。

在您的情况下,当您从表A中获取状态时,您无法检查它,但是您可以在插入时对其进行限制,这样在您的情况下不允许重复。例如。

insert into A(id1, id2, state, id3)
values('val1', 'val1', 'val3', 'val4')
IF NOT EXISTS

所以执行的第一个将通过,但第二个将失败。因此,请根据业务需求处理客户端的重试/任何失败机制。

查看此文档以获取更多信息:https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0