иногда ошибка "Command update failed: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction"
Это в документации советуют проверять и делать повторную попытку записи.
А нельзя ли как-то указать монге чтобы она не начинала транзакцию или операцию, пока не окончена предыдущая? Ну как бы работала чтобы просто в 1 поток и всё
начинать или нет говорит клиент, т.е. ваш софт и делается это всегда в явном виде, проверяйте код где вы стартуете их. Вообще использование транзакций - это особенная ситуация, когда почемуто другими способами вы не можете решить проблему и осознанно выбираете этот путь, и значит вы понимаете их ограничения и что в случае фейла транзакции надо чтото делать либо ретраить либо еще чтото либо вообще просто ошибку юзеру показать и откинуть запрос.
Почему особенная ситуация? Это абсолютно нормально. Транзакции нужны и повсеместно используются. Монга просто ведет себя уродски. Она пытается взять блокировку при начале транзакции в течение 5 миллисекунд, и если не получилось, выдает ошибку. А я хочу чтоб она до победного пыталась это сделать. Ну или хотя бы чтобы можно было указать - например, 5000 миллисекунд. Иначе придется везде писать обвязку - чтобы повторные попытки записи были. Лишний код получается, там где его могло бы не быть
а поподробней можно что за инфа про 5 мс, ссылочкой бы
а особенная потому что обычно все решается обычными апдейтами без транзакций которые как раз просто на уровне документа работают без блокировок
Да я щас с телефона, на компе гуглил. В mongo shell это можно поменять. И когда я поменял, там вылезло что «изменено с 5 на 5000», то есть не наврали. Правда это не сработало, как были ошибки так и остались
настройки сессий наверняка надо на каждой сессии указывать, а не разово гдето
Если мне надо изменить документы сразу в 2 коллекциях или в 2 документах в 1 коллекции? Классический пример. Списываем деньги с 1 юзера и добавляем другому. До кучи можно еще куда-то добавлять инфу о том что был перевод средств. Если не использовать транзакции, то при сбое, могут списаться деньги с 1 человека, а второму не зачислиться, и лог об этом тоже не будет создан. Деньги просто как бы исчезнут. Ну в журнале можно будет посмотреть, но это уже не бизнес-логика приложения будет, а ручная работа по поиску пропавшего бабла
это чуть ли не единственная ситуация применения транзакций в принципе, когда без них реально нельзя. Вы же говорили что это обычная ситуация и они походу нужны чуть ли не на каждый чих
вот конкретно сейчас в приложении вы что делаете в транзакциях?
Таких ситуаций миллиард. Например вот у меня ситуация такая щас. Я логгирую все обращения к api бекенда. Запись идет просто о запросе (юзерагент, заголовки, тело и т.д.) и потом сразу пишу в другую таблицу количество запросов пользователя за конкретный день (вставка или инкремент). Это должно быть согласовано.
у вас реально в одной транзакции это делается?
Да, но это только 1 пример, таких наверное еще пара десятков.
Обсуждают сегодня