mongoose. Перед изменением документа мне нужно обязательно проверять определенные поля.
Проблема - дабл спендинг.
Может произойти ситуация, при которой 2 одинаковых транзакции полетят в базу данных, и в зависимости от результатов проверки - нужно принять только одну транзакцию.
Можно использовать хук типа
schema.pre('updateOne', {
document: true,
query: false
}, function() {
let document = await this.model.findOne(this.getQuery());
if (document.field) {
next()
} else {
return;
}
});
Так я получу документ перед его обновлением и проведу проверку. Проблема в том, что если 2 транзакции прилетели одновременно, то в обоих случаях в данном хуке выяснится, что состояние документа одно, после чего обе транзакции применятся. Потому что проверка будет происходить параллельно, а не последовательно. Можно ли как-то избежать такой ситуации?
Я имею ввиду именно на уровне базы данных, а не на уровне приложения.
если вам нужно блокировать документ до момента окончания каких-либо действий над ним, то стоит посмотреть в сторону транзакций: https://docs.mongodb.com/master/core/transactions/
Обсуждают сегодня