определенную коллекцию, скажем, около двух-трех тысяч. Транзакция успешно завершается. Однако сразу после транзакции я запрашиваю все вставленные документы методов find, и мне ничего не возвращается. Почему я при запросе "свежевставленных" документов, которые вставились в процессе транзакции, в ответ получаю пусто? Запрос этот делаю сразу после того, как завершается транзакция.
Все это происходит на Replica Set из 3-х нод. Параметры транзакции: readConcern - snapshot, writeConcern - majority, readPreference - primary.
В чем проблема, хоть убей не пойму. Прям магия какая-то.
Отмечу еще пару любопытных моментов. Когда я запускаю транзакцию, отслеживаю состояние через Robo 3T. И там все документы сразу появляются без проблем после транзакции. Кроме того, если после транзакции не сразу запрашивать find, а через setTimeout в 1 секунду, то все документы вернутся.
Такое впечатление, будто монговские транзакции не очень то и ACID. О какой durability может идти речь, если после успешного коммита я не могу сразу получить вставленные документы?
Не понятно, вы в робо 3т видите документы, а из кода нет?
Ага, и это как раз происходит, видимо, из-за того, что документы "появляются" и "становятся видимыми" для обычных запросов спустя некотрое количество мс после коммита транзакции. Поэтому когда я обновляю робо 3т, то там они уже успевают появится. Вопрос тут в acid принципах, Durability же вроде должно гарантировать, что если коммит произошел, то изменения уже железно находятся в базе.
У find какой readConern?
Для find readConern не указывал, так что там наверное по умолчанию.
В таком случае вам нужен linearizable или majority
Сейчас попробовал, но, к сожалению, это не помогло. Все еще возвращает пустоту.
Попробуйте выполнить чтение в колбэке транзакции, чтоб исключить вариант с тем, что у вас порядок выполнения запросов соответсвует вашей задаче
Обсуждают сегодня