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

Окей, приведу пример. Есть эндпоинт, который создает stickerpack, также есть

эндпоинт, который создает favorite для конкретного юзера, который ссылается на stickerpack. При удалении stickerpack должны удалиться и всего его favorite, нужна ли здесь транзакция? А что если не проекте куча таких примеров, всё обмазать транзакциями?)

37 ответов

19 просмотров

cascade

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

Вопрос, а нужна ли тебе здесь консистентность? Ну соответственно нужна или нет транзакция.

Нет, это каскадное удаление через внешний ключ на уровне БД. Транзакции тут не при чём

Mansur- Автор вопроса
Dmitriy Sviridov
Нет, это каскадное удаление через внешний ключ на ...

Для удаления stickerpack я иду в коллекцию stickerpacks и удаляю его там, после я иду в коллекцию favorties и подчищаю там. Все это в MongoDb. Может быть я не внимателен, но я не заметил возможность удалить документы одновременно в двух коллекциях, кроме как использовать транзакцию.

Mansur
Для удаления stickerpack я иду в коллекцию sticker...

Я не знаю насчёт Монги, но в PostgreSQL внешнему ключу можно задать свойство ON DELETE CASCADE - и связанные данные автоматически будут подчищаться

Не удалять ничего, а помечать hidden=true

Mansur- Автор вопроса
Dmitriy Sviridov
Я не знаю насчёт Монги, но в PostgreSQL внешнему к...

И это всё будет в рамках одного запроса, а что в случае неудачи? Они либо подчищаются все вместе, либо нет?

Dmitriy Sviridov
Я не знаю насчёт Монги, но в PostgreSQL внешнему к...

Это не очень хорошая практика, когда что-то неявно удаляется

Mansur
И это всё будет в рамках одного запроса, а что в с...

Всё в рамках одного запроса. Атомарностью занимается база данных

Владимир Столяров
Это не очень хорошая практика, когда что-то неявно...

Каскадное удаление на уровне БД - это стандартная практика. Удалите несколько десятков тысяч данных из таблицы - увидите, как быстро это сделается. Потому что будет всего лишь 1 запрос, а связи выпилит сам PostgreSQL

Mansur
Для удаления stickerpack я иду в коллекцию sticker...

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

Mansur- Автор вопроса
Andrey Panov
Да в монге же нет форенжкей. Она точно в какой-то ...

Ну вот и я вижу два путя: брать транзакцию и терпеть или запускать джобу и следить за чистотой коллекции

Mansur
Ну вот и я вижу два путя: брать транзакцию и терпе...

1. Следить за чистотой. 2. Удалять что можешь без транзакций.

Mansur- Автор вопроса
Andrey Panov
1. Следить за чистотой. 2. Удалять что можешь без ...

Но в случае с insert (вставить несколько сущностей по разным коллекциям) такое уже не прокатит ведь и придется брать транзакцию и работать или также формируют джобы и досовывают то, что решило не засунуться?

Mansur
Но в случае с insert (вставить несколько сущностей...

Так в монге судя по документации есть транзакции. Так что добавление делай в транзакции.

Mansur- Автор вопроса
Andrey Panov
Так в монге судя по документации есть транзакции. ...

Они есть (некоторые их не считают за транзакции), но они есть. И мой первоначальный вопрос был в том, как формализировать, когда стоит брать транзакцию или танцевать с бубном.

Daniel Podolsky
foreign key читается как форин ки

а я всегда как форэйн произношу 😅

Mansur
Они есть (некоторые их не считают за транзакции), ...

Когда более одной коллекции меняешь - транзакция. Это мой финальный совет :)

Mansur
Для удаления stickerpack я иду в коллекцию sticker...

статусы и в асинхроне двигать статусы по каждой операции

Mansur- Автор вопроса
Mansur
Не совсем понимаю о чем речь)

Выставляешь на удаление стикерпака и фаворитс флаги в отдельную коллекцию. Выставляешь воркер который по таймингу считывает статус у таких записей и удаляет записи:)

Mansur- Автор вопроса
Sula
Выставляешь на удаление стикерпака и фаворитс флаг...

Понял, спасибо, Вы таким способом избегаете использование транзакций, когда надо менять две коллекции атомарно?

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

Ну я лишь способ назвал избежания. Еще бы поискал варианты, но легче транзакцию в монге сделать кажись

Mansur- Автор вопроса
Sula
Ну я лишь способ назвал избежания. Еще бы поискал...

Ну способ, валидный в целом, в данном случае, согласен

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

Это он тебе асинхронный подход предлагает затащить. Это валидный вариант для долгих задач, типа отчёт построить. Но кажись это не твое.

Sula
Ну я лишь способ назвал избежания. Еще бы поискал...

Такой способ не избавляет от транзакции. Или во всяком случае не позволяет ее откатить в случае неуспеха.

Sula
например?

Ты удалил в нескольких коллекциях, потом ошибка... Часть данных не удалена. Те что не удалены уже не вернуть...

Sula
какая ошибка, не пойму…

Ну например сеть пропала.

Andrey Panov
Ну например сеть пропала.

на каком этапе, на клиентском запросе?

Sula
на каком этапе, на клиентском запросе?

Воркер твой потерял сеть, пока удалял... Часть данных удалил, а часть нет. Стикер Пак удалил, а стикеры нет.

Andrey Panov
Воркер твой потерял сеть, пока удалял... Часть дан...

Если сеть пропала, при восстановлении сети статус подхватиться и завершит удаление второй части. Ну я не знаю насколько это критично вернуть такую транзакцию

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта