Всем привет. Столкнулся с такой штукой - при параллельных запросах вылазиет

иногда ошибка "Command update failed: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction"
Это в документации советуют проверять и делать повторную попытку записи.
А нельзя ли как-то указать монге чтобы она не начинала транзакцию или операцию, пока не окончена предыдущая? Ну как бы работала чтобы просто в 1 поток и всё

12 ответов

37 просмотров

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

Easy Rider-Lord Автор вопроса
Nick
начинать или нет говорит клиент, т.е. ваш софт и д...

Почему особенная ситуация? Это абсолютно нормально. Транзакции нужны и повсеместно используются. Монга просто ведет себя уродски. Она пытается взять блокировку при начале транзакции в течение 5 миллисекунд, и если не получилось, выдает ошибку. А я хочу чтоб она до победного пыталась это сделать. Ну или хотя бы чтобы можно было указать - например, 5000 миллисекунд. Иначе придется везде писать обвязку - чтобы повторные попытки записи были. Лишний код получается, там где его могло бы не быть

Easy Rider Lord
Почему особенная ситуация? Это абсолютно нормально...

а поподробней можно что за инфа про 5 мс, ссылочкой бы

Easy Rider Lord
Почему особенная ситуация? Это абсолютно нормально...

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

Easy Rider-Lord Автор вопроса
Nick
а поподробней можно что за инфа про 5 мс, ссылочко...

Да я щас с телефона, на компе гуглил. В mongo shell это можно поменять. И когда я поменял, там вылезло что «изменено с 5 на 5000», то есть не наврали. Правда это не сработало, как были ошибки так и остались

Easy Rider Lord
Да я щас с телефона, на компе гуглил. В mongo shel...

настройки сессий наверняка надо на каждой сессии указывать, а не разово гдето

Easy Rider-Lord Автор вопроса
Nick
а особенная потому что обычно все решается обычным...

Если мне надо изменить документы сразу в 2 коллекциях или в 2 документах в 1 коллекции? Классический пример. Списываем деньги с 1 юзера и добавляем другому. До кучи можно еще куда-то добавлять инфу о том что был перевод средств. Если не использовать транзакции, то при сбое, могут списаться деньги с 1 человека, а второму не зачислиться, и лог об этом тоже не будет создан. Деньги просто как бы исчезнут. Ну в журнале можно будет посмотреть, но это уже не бизнес-логика приложения будет, а ручная работа по поиску пропавшего бабла

Easy Rider Lord
Если мне надо изменить документы сразу в 2 коллекц...

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

Easy Rider Lord
Если мне надо изменить документы сразу в 2 коллекц...

вот конкретно сейчас в приложении вы что делаете в транзакциях?

Easy Rider-Lord Автор вопроса
Nick
это чуть ли не единственная ситуация применения тр...

Таких ситуаций миллиард. Например вот у меня ситуация такая щас. Я логгирую все обращения к api бекенда. Запись идет просто о запросе (юзерагент, заголовки, тело и т.д.) и потом сразу пишу в другую таблицу количество запросов пользователя за конкретный день (вставка или инкремент). Это должно быть согласовано.

Easy Rider Lord
Таких ситуаций миллиард. Например вот у меня ситуа...

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

Easy Rider-Lord Автор вопроса
Nick
у вас реально в одной транзакции это делается?

Да, но это только 1 пример, таких наверное еще пара десятков.

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

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

Я колись ставив гуглу антиспам 3.0, може і норм, але мені не дуже зайшло. Теж думав тиждень, що його і куди. Зупинився на трех варіантах відразу всі три і включив 1. Перевір...
𝓔𝓾𝓰𝓮𝓷𝓮𝓥 J
2
Это везде так работает, или еще колдовать нужно?)
Квадрат Гипотенузы
6
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Всем привет, может уже кто-то пытался выдернуть из api информацию о дате рождения пользователя Есть ли вообще такая возможность?
Artem Stormageddon
2
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Всем привет! Есть камеры для наблюдения с встроенной видеоаналитикой (детектор лиц, например). Как я понял, все вычисления и анализ происходят на самом железе камеры, и пр...
Артур 🌞 Сапрыкин
1
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Можно ли отследить отправление местоположения именно по кнопке, чтобы 100% отправлялось текущее, а не любое выбранное?
Lencore
2
Карта сайта