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

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

7 ответов

8 просмотров

Не понятно, вы в робо 3т видите документы, а из кода нет?

Ilya- Автор вопроса
Andrey
Не понятно, вы в робо 3т видите документы, а из ко...

Ага, и это как раз происходит, видимо, из-за того, что документы "появляются" и "становятся видимыми" для обычных запросов спустя некотрое количество мс после коммита транзакции. Поэтому когда я обновляю робо 3т, то там они уже успевают появится. Вопрос тут в acid принципах, Durability же вроде должно гарантировать, что если коммит произошел, то изменения уже железно находятся в базе.

У find какой readConern?

Ilya- Автор вопроса
yopp 💉💉
У find какой readConern?

Для find readConern не указывал, так что там наверное по умолчанию.

Ilya
Для find readConern не указывал, так что там навер...

В таком случае вам нужен linearizable или majority

Ilya- Автор вопроса
yopp 💉💉
В таком случае вам нужен linearizable или majority

Сейчас попробовал, но, к сожалению, это не помогло. Все еще возвращает пустоту.

Ilya
Сейчас попробовал, но, к сожалению, это не помогло...

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

Похожие вопросы

Обсуждают сегодня

Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
с помощью чего можно бота добавить как админа в чат? (условно в боте есть кнопка, нажатие на которую приводит тебя к выбору чата и выдаче прав боту)
ηє νєямσяє
5
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
Добрый день, не подскажите, если в OC-V3 поменять страндартную директорию /storage/ на /storage2/ - не будет сильно много проблем ?
Max Dubovsky
32
Добрый день, подскажите как правильно сделать filter в backend-e. Есть модель (товар) у который связь belongsToMany (компания), компаний > 4k, поэтому выборку типа ->all(); н...
Max Dubovsky
7
Всем привет, есть таблица компонентов (например материнка, процессор, видеокарта и тд) components и нужно еще реализовать механизм "совместимости" (те какой-то словарь, мол од...
Vladimir
2
А как заставить поиск искать? Есть такая формочка <select class="form-control custom-select" name="brand_id" data-handler="onGetBrands"></select>
Денис Александрович
5
А цены чем оправданы?
Lencore
7
Hello, I want to ask. I trained EfficientNet V2 Small and achieved 98% accuracy and F1 score on test data. I did the same with a simple CNN and achieved 97% accuracy and F1 sc...
~
2
Карта сайта