0

有两个数据中心,每个数据中心有 3 个节点。我正在以本地仲裁的一致性级别对同一个表进行两次简单的插入(非常快地背靠背)。该表有一个分区键,没有聚簇列。

有时第一个插入胜过第二个。第一个插入语句生成的数据是保存在数据库中的数据,即使我在那之后立即进行了插入。

C# 代码

var statement = "Insert Into customer (id,name) Values (1, "foo")";
statement.SetConsistencyLevel(ConsistencyLevel.LocalQuorum);
session.Execute(statement);
4

1 回答 1

2

在客户端设置时间戳。在大多数新驱动程序中,这是自动完成的,以更好地确保订单保留。然而,较旧的驱动程序或 Cassandra 2.1 之前的版本不受支持,需要进行查询。我不知道您使用的是什么驱动程序或版本,但您也可以将其放在 CQL 中。虽然它在协议级别上受支持,但驱动程序应该有更好的机制。

就像是:var statement = "INSERT INTO customer (id,name) VALUES (1, 'foo') USING TIMESTAMP {microsecond timestamp}";

最好的方法是使用单原子时间戳,这样每次调用总是高于最后一次(即使用当前毫秒并添加一个计数器)。我不知道 C# 来告诉你如何最好地解决这个问题。查看https://docs.datastax.com/en/developer/csharp-driver/3.3/features/query-timestamps/#using-a-timestamp-generator

如果您没有在突变上设置时间戳,协调器将在解析查询后分配它。由于网络和 netty 队列可以做一些有趣的事情,因此顺序不是确定的,尤其是当它们最终位于可能有一些时钟漂移的不同节点上时。

于 2018-05-23T15:42:13.907 回答