В mongodb возможно ли создать транзакцию из 2 запросов?

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

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

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

Всего 1 ответ


Вы добавляете простой 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 операция над одним документом является атомарной

И

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

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


Есть идеи?

10000