在复制因子大于1(例如3)的情况下,删除行并将其重新插入表的特定情况不会按预期工作。
我尝试在查询中使用仲裁进行读取以及写入和时间戳,但没有成功。
如果复制因子设置为1,则一切正常。我的群集中有5个节点。
在删除和插入操作后尝试读取时,问题变得可见。读取不会返回应该插入的行。
有人可以分享一下他们的想法吗?
修改
以下是我从代码
尝试的内容数据库创建脚本:
DROP KEYSPACE IF EXISTS consistency_check;
CREATE KEYSPACE IF NOT EXISTS consistency_check WITH replication = {'class': 'NetworkTopologyStrategy', 'Cassandra': 3} AND durable_writes = true;
USE consistency_check;
CREATE TABLE IF NOT EXISTS resource (
id uuid,
col1 text,
col2 text,
col3 text,
col4 text,
PRIMARY KEY(id, col1)
);
C#单元测试代码:
public class Resource
{
public Guid Id { get; set; }
public string Col1 { get; set; }
public string Col2 { get; set; }
public string Col3 { get; set; }
public string Col4 { get; set; }
}
public class MyMappings : Mappings
{
public MyMappings()
{
For<Resource>()
.TableName("resource")
.PartitionKey(u => u.Id)
.Column(u => u.Id, cm => cm.WithName("id"))
.Column(u => u.Col1, cm => cm.WithName("col1"))
.Column(u => u.Col2, cm => cm.WithName("col2"))
.Column(u => u.Col3, cm => cm.WithName("col3"))
.Column(u => u.Col4, cm => cm.WithName("col4"));
}
}
//Following test fails always
[TestMethod]
public async Task DeleteInsert()
{
var table = new Table<Resource>(_session);
_session.Execute("truncate resource");
for (int i = 0; i < 10; i++)
{
var id = Guid.NewGuid();
await table.Insert(new Resource { Id = id, Col1 = id.ToString(), Col2 = id.ToString(), Col3 = id.ToString(), Col4 = id.ToString() }).ExecuteAsync().ConfigureAwait(false);
}
var data = (await table.ExecuteAsync().ConfigureAwait(false)).ToList();
foreach (var datum in data)
{
await table.Where(e => e.Id == datum.Id).Delete().ExecuteAsync().ConfigureAwait(false);
}
foreach (var datum in data)
{
await table.Insert(datum).ExecuteAsync().ConfigureAwait(false);
}
var data1 = (await table.ExecuteAsync().ConfigureAwait(false)).ToList();
Console.WriteLine("data length: {0}", data.Count);
Console.WriteLine("data1 length: {0}", data1.Count);
Assert.IsTrue(data.Count == 10);
Assert.IsTrue(data1.Count == 10);
}
答案 0 :(得分:0)
您在哪里设置一致性级别?如果您使用仲裁进行读写操作,则不应该遇到此问题。
答案 1 :(得分:0)
看起来像您以异步方式运行插入和删除操作-因此删除操作可以在插入操作之前进行。在这种情况下,将不满足delete子句,并且不会删除行。
我对C#async / await构造不是很熟悉,所以我可能会缺少一些东西