MongoDb Upsert тупик - PullRequest
       7

MongoDb Upsert тупик

3 голосов
/ 14 октября 2011

Возможно ли достигнуть тупиковых ситуаций при операциях вставки MongoDb?Я выполняю нагрузочное тестирование операции upsert, которая выглядит следующим образом:

db.update(
    { foo: {a: 'xxx', b: 'yyy'}, $lt: {"order.date": someDate}}, 
    {order: order}, 
    true, false);

Развернуто на машине Azure с официальным драйвером mongodb C #.Одиночный экземпляр, пока нет наборов реплик или шардинга.

Когда я запускаю 5000 этой же команды обновления, распределяется между 200 одновременными потоками (2 машины по 100 потоков в каждой), в большинстве случаев она заканчивается тупиками,Т.е. многие звонки никогда не возвращаются.Я могу видеть из db.currentOp () через консоль, многие обновления все еще там, застряли в заблокированном: true, с lockType: 'write'.

Почему возникает эта тупиковая ситуация?Как это возможно?И как мне это предотвратить?Существуют ли какие-либо конкретные указания относительно того, каких операций следует избегать, чтобы избежать взаимоблокировок на mongodb?

Связана ли $ atomic с решением?Я даже не знаю, как установить $ atomic: true на c #, хотя это, вероятно, не имеет отношения к этой проблеме взаимоблокировки.

1 Ответ

0 голосов
/ 24 апреля 2012

$ atomic должен помочь

db.update(
    {
        $and: [
            { foo: { a: 'xxx', b: 'yyy' },
            { $lt: { 'order.date': someDate } }
        ],
        $atomic: true
    },
    { order: order },
    true,
    false
);

также вы можете захотеть использовать $ и предложение. проверьте объяснение вашего звонка, чтобы увидеть, какие индексы используются и т. д. *

...