172 похожих чатов

Здравствуйте народ, пишу бота для телеграма, использую pg библиотеку для

запросов

На каждый апдейт телеги делаю запрос к базе, затем если что то надо то меняю и сохраняю, дело в том, что может прийти второй апдейт где будут другие изменения и первый сохраняется, но второй, не взяв старые изменения, тоже сохраняется
Получатель что у первого изменения были попросту незамеченными

Храню первичным ключём айди пользователя и в jsonb формате объект пользователя со всей информацией
Что можете посоветовать? Пишу сюда как профи по этой бд

18 ответов

10 просмотров

такого быть не может. Покажите запрос, которым обновляете

Как минимум — прочесть про mvcc и транзакцыи. Это сложная тема, попытка кодить по разрозненным рецэптам из чятика скорее всего приведёт к плохому результату.

Rustam Baekenov
такого быть не может. Покажите запрос, которым обн...

Не вижу причин недоверять человеку. Напороть дажэ в транзакцыи очень несложно.

Ilya Anfimov
Не вижу причин недоверять человеку. Напороть дажэ...

тогда мы стали свидетелями lost update по описанию. Конечно, так какой-то косяк именно в запросе/транзакции, но вопрос поставлен как есть

Rustam Baekenov
такого быть не может. Покажите запрос, которым обн...

Взятие пользователя: SELECT data FROM users WHERE user_id = 123; Сохранение: UPDATE users SET data = '{}' WHERE user_id = 123; Где {} там объект пользователя, 123 это соответственно айди Опишу как я понимаю ситуацию >Пришел первый апдейт инфа1 = взятие пользователя с бд *изменения в инфа1* >Пришел второй апдейт инфа2 = взятие пользователя с бд *сохранение инфа1 в базу данных* *изменения в инфа2* *сохранение инфа2 в базу данных* Получилось так, что инфа1 сохранилась, но инфа2 имеет старые параметры без изменений в инфа1 и соответственно они были утеряны, как то так, надеюсь понятно описал https://t.me/pgsql/339656 ^ про это почитаю

🔑♥️ 𝑉𝑎𝑛𝑑𝑜𝑚𝑎𝑠 🔗 🌨
Взятие пользователя: SELECT data FROM users WHERE ...

добавьте колонку version и в update where условие обновлять только нужную версию

S B
добавьте колонку version и в update where условие ...

Мне в любом случае нужно что бы оба изменений сохранились В одном может быть изменения баланс а во втором снятие привилегии В итоге баланс не будет изменен хотя надо бы

🔑♥️ 𝑉𝑎𝑛𝑑𝑜𝑚𝑎𝑠 🔗 🌨
Мне в любом случае нужно что бы оба изменений сохр...

если update изменил 0 строк — значит он пытался обновить старую версию и нужно перечитать значение из строки и смержить по какому-то принципу

🔑♥️ 𝑉𝑎𝑛𝑑𝑜𝑚𝑎𝑠 🔗 🌨
Мне в любом случае нужно что бы оба изменений сохр...

я так понимаю надо что бы апдейт всегда проходил по актуальным данным?

🔑♥️ 𝑉𝑎𝑛𝑑𝑜𝑚𝑎𝑠 🔗 🌨
Да

https://postgrespro.ru/docs/postgrespro/13/explicit-locking ?

Дмитрий Тремасов
https://postgrespro.ru/docs/postgrespro/13/explici...

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

Дмитрий Тремасов
Ага. Event Sourcing.

это классическая проблема web gui интерфейсов, когда поля формы редактирования в браузере у клиента содержат значения которые уже 100500 раз перезаписаны в базе другими апдейтами и когда клиент нажимает save — данные всех этих других апдейтов (сделанных в других вкладках например или другом браузере) — затираются, у плохо написанных приложений — затираются молча :-) обычно для решения этой проблемы вводят версию строки и save формы обновляет только если версия в базе совпадает с версией данных в форме, а если не совпадает то показывает ошибку или предложение смержить изменения. в исходном вопросе есть слово «бот» так что там скорее всего как раз «формы ввода обновляемые асинхронно из нескольких клиентов» и явные блокировки тут не помогут, не будете же вы держать сессию для каждого клиента бота с блокировкой. но вообще я не вчитывался, возможно там и проще ситуация и всё решит select for update :-)

S B
это классическая проблема web gui интерфейсов, ког...

я думаю select for update решит, но варианты да - разные могут быть

🔑♥️ 𝑉𝑎𝑛𝑑𝑜𝑚𝑎𝑠 🔗 🌨
Почитал, да, возможно это то что мне надо, гляну п...

Ну по хорошему вам нужна очередь, в которую добавляются корректировки, а уже из очереди вносятся изменения в базу. Иначе может произойти нарушение последовательности изменений и результат в базе окажется некорректным

Valery
Ну по хорошему вам нужна очередь, в которую добавл...

очередь не гарантирует четкую последовательность, вроде

S B
добавьте колонку version и в update where условие ...

Жэсть. Ненадо так делать в RDBMS. Тут есть встроенные средства изоляцыи и сериализацыи, делать что-то внешнее имеет смысл только когда они исчерпаны.

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

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

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Всем привет! Использую gitlab-ci. Настроил gitlab-agent для деплоя в куб. При деплое проекта в логах такая ошибка: Executing deploy plan failed to watch "ns:my-project/Ingress...
Konstantin Moiseev
4
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
а не подскажете вот это скрин из какой IDE ?
Iluha Companets
14
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Народ всем привет Подскажите, как включить самописные dll библиотеки в итоговую сборку Сейчас при запуске dev сервера локально формируется папка build, из которой запускается...
Андрей
4
Карта сайта