В mongodb возможно ли создать транзакцию из 2 запросов? Как найти и обновить отдельно? - PullRequest
1 голос
/ 23 марта 2020

Я использую mongodb (с mon goose), и у меня есть случай, когда я нахожу документ, запускаю несколько сложных условных проверок и затем обновляю документ.

Это нормально, но теперь я хочу убедиться, что документ, который я обновляю, не обновлялся другим запросом на обновление, пока выполнялись мои условия.

Могу ли я создать блокировку или как-то содержать все эти действия внутри транзакции?

1 Ответ

0 голосов
/ 23 марта 2020

Вы добавляете простое поле editor и убедитесь, что каждый процесс владеет документом при наступлении времени его обновления.

Вот простой пример:

let processId = uniqueID;

//if doc is none then a different process 'owns' it. need to decide on behaviour.
let doc = await collection.findOneAndUpdate({_id: docId, editor: {$exists: false}}, {$set: {editor: processId}})

### do calculations. ###

let newValue = calculatedValue;
let newDoc = await collection.findOneAndUpdate({_id: docId, editor: processId}, {$unset: {editor: ""}})

Я чувствую что использование транзакций в качестве suggjested в комментариях является излишним, из документов:

В MongoDB операция над одним документом является atomi c

И

Для ситуаций, требующих атомарности чтения и записи в несколько документов, MongoDB поддерживает транзакции с несколькими документами.

Транзакции предназначены для более сложных ситуаций. чем это, и я чувствую, что эти накладные расходы не нужны, так как достаточно простого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...