我正在使用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中解决这个问题?
答案 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