我需要做的是删除整个项目集合并导入一组新数据。
新数据集包含新项目和现有项目(已删除项目的ID相同)。
我需要在具有与其他服务器激活的Master-Master复制的服务器上执行此操作,因此这是方案:
Master-Master复制中的Server1和Server2。 我在Server1上删除并批量插入数据,数据在Server2上复制。
这就是我现在正在做的事情:
第1步。
在Server1中插入50000条记录。
List<Test> data = new List<Test>();
for (int i = 1; i <= 50000; i++)
{
var t = new Test();
t.Id = "Tests/" + i.ToString(); // NOTICE THIS
t.Name = "Test" + i.ToString();
t.Description = "Test nr. " + i.ToString();
t.Time = DateTime.Now.TimeOfDay.ToString("hhmmssff");
data.Add(t);
}
using (var bulkInsert = docStore.BulkInsert(options: new Raven.Abstractions.Data.BulkInsertOptions() { CheckForUpdates = true, BatchSize = 1024 }))
{
foreach (var d in data)
{
bulkInsert.Store(d);
}
}
正确插入50000项并将其复制到Server2中,因此我现在在Server1和Server2中都有50000条记录。
第2步。
我启动一个程序来删除Server1中的50000项集合并插入一组新的500项。
// DELETE
var op = docStore.DatabaseCommands.DeleteByIndex("Raven/DocumentsByEntityName", new IndexQuery { Query = "Tag:" + "Tests" }, allowStale: false);
op.WaitForCompletion();
// INSERT
List<Test> data = new List<Test>();
for (int i = 1; i <= 500; i++)
{
var t = new Test();
t.Id = "Tests/" + i.ToString(); // NOTICE THIS, SAME IDs DELETED ABOVE
t.Name = "Test" + i.ToString();
t.Description = "Test nr. " + i.ToString();
t.Time = DateTime.Now.TimeOfDay.ToString("hhmmssff");
data.Add(t);
}
using (var bulkInsert = docStore.BulkInsert(options: new Raven.Abstractions.Data.BulkInsertOptions() { CheckForUpdates = true, BatchSize = 1024 }))
{
foreach (var d in data)
{
bulkInsert.Store(d);
}
}
当此过程开始时,我在两个服务器中都正确地看到测试项目被删除,我看到两个服务器中的文档都在减少。
当完全删除Server1中的集合时,将启动Insert过程,但是当发生这种情况时,Server2集合尚未为空。
让我们说当Server1删除操作完成时,Server2集合中仍有10000个项目。
Server1上的Insert操作立即启动,插入的数据开始被复制。
Server2中发生的情况是删除操作已停止并插入了新的500项,因此当该过程完成时,我在Server1上有500个项目(从ID 1到ID 500)和Server2上的10500项。
如果我现在删除Server1上的集合(来自Raven Management Studio),则会从Server2中删除500个项目,因此Server2中没有项目,Server2中没有项目。
我还试图结合DeleteByIndex&#34; WaitForCompletion&#34;设置和BulkInsert&#34; CheckForUpdates&#34;使用以下结果进行设置:
1
DeleteByIndex.WaitForCompletion = true
BulkInsert.CheckForUpdates = true
结果:
当Server1上的Insert启动时,在Server2中停止删除复制(这是上面解释的情况)
2
DeleteByIndex.WaitForCompletion = true
BulkInsert.CheckForUpdates = false
结果:
当Server1上的Insert启动时,在Server2中停止删除复制(与上面相同)
3
DeleteByIndex.WaitForCompletion = false
BulkInsert.CheckForUpdates = true
结果:
插入启动时收到并发修改错误。
删除在两台服务器上完成,因此在程序结束时我的两台服务器上都没有数据。
4
DeleteByIndex.WaitForCompletion = false
BulkInsert.CheckForUpdates = false
结果:
插入启动时收到非法重复键错误, 删除在两台服务器上完成,因此在程序结束时我的两台服务器上都没有数据。
有人可以建议管理这种情况的最佳方法吗?
我回顾了目标:
我需要在Mster-Master复制方案中完全删除一个集合并导入新数据。 新数据可以是全新项目或以前存在的数据。
提前致谢。