У меня есть довольно простой метод для добавления записи в коллекцию:
public void UpsertEntry(string collectionName, Entry entry)
{
var collection = GetCollection(collectionName);
var filter = Builders<Entry>.Filter.Eq(x => x.Key, entry.Key);
var update = Builders<Entry>.Update
.SetOnInsert(x => x.Id, ObjectId.GenerateNewId())
.SetOnInsert(x => x.Key, entry.Key)
.Set(x => x.LastUpdated, DateTime.Now)
.Set(x => x.Data, entry.Data)
.Inc(x => x.Version, 1);
var result = collection.UpdateOne(filter, update, new UpdateOptions
{
IsUpsert = true
});
}
Коллекция имеет уникальный индекс для Key.
Я вызываю метод UpsertEntry вПараллельно. Для цикла
Parallel.For(0, 100, i =>
{
entry.Key = $"key+{i}";
UpsertEntry(coll, entry);
});
Я бы ожидал вставить 100 записей, но вместо этого я получил E11000 duplicate key error collection: TestDB.test::c7 index: key_1 dup key: { : "key+1" }
.Почему у меня возникают проблемы с параллелизмом?Что не так с моим кодом?