@shamyyl
Web-разработчик

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

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

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

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

Хотелось бы услышать аргументов вместе с какими-нибудь кейсами, что подход "Нафиг транзакции, надо писать правильный код" не верен.
  • Вопрос задан
  • 524 просмотра
Решения вопроса 2
saboteur_kiev
@saboteur_kiev
software engineer
"1) Добавить транзакцию - всего несколько строк кода.
2) Как раз таки хотелось бы услышать, какие кейсы проблем здесь возможны"

Написать несколько строк кода - время разработчиков и деньги заказчика."
Протестировать несколько строк кода - время тестировщиков и деньги заказчика.
Добиться создания новой таски, которую оплатит заказчик - время менеджеров и деньги заказчика

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

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

Либо какие-то просветленные, либо дети NoSQL-эры. Скорее всего второе.

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

Да, должна контроллироваться на уровне приложения. Но в большинстве случаев это не повод отказываться от внешний ключей и прочих средств контроля целостности. Да, я видел, что некоторые вендоры НЕ используют ограничения целостности в релизных версиях продуктов, но это скорее исключение, чем правило. И да, самое главное - в большинстве случаев данные живут дольше, чем приложение, с ними работающее. Или - также не редкость - приложений, работающий с одной базой - несколько. Тогда вам рано или поздно захочется дополнительный уровень "доверия", т.е. контроля целостности. Вы должны понимать, что неконсистентные данные в базе - это как правило большой или очень большой гемор, т.к. после появления таких данных в базе очень непросто понять, что они там делают, и что ВАМ теперь с ними делать.
Ограничения целостности снимают только если они заметно снижают производительность БД, её (производительности) не хватает, других способов быстро поправить ситуацию нет, и у вас на данный момент уже есть хоть какая-то уверенность, что приложение не накосячит в БД.

А теперь последнее. Целостность данных - не единственное, и даже не главное, для чего нужны и полезны транзакции. Дмитрий Энтелис классно написал про профнепригодность: попросите своих коллег написать биллинг кому-нибудь, выкатить его в продакшн, а потом объяснить начальнику отдела и директору, почему у некоторых клиентов, купивших две услуги по 500, списалось только за одну услугу. Можете рассказать коллегам про уровни изоляции - тут кстати навалом примеров.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Главный аргумент за использование транзакций, это не запись связанных данных, - а корректная обработка конкурентных запросов, в тех случаях когда это критично.
Условно писать без транзакций биллинг - показатель профнепригодности, а вот какой нибудь бложик - вполне нормально.
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Т.е. вы сами услышали где-то или "душой поняли" что транзакции МАСТХЕВ.
Начали об этом спорить с коллегами.
При этом у вас нет ни одного аргумента в их пользу?
А теперь просите чтобы мы за вас поспорили с вашими коллегами.
Вы прямо вылитый интернет-воен или диванный, не знаю есть ли разница.

По теме:
https://ru.wikipedia.org/wiki/ACID
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Ну как бы и без транзакций можно обходиться. Например использовать поле version, которое прибавляется каждый раз при при update.
Если вся работа с данными сводится к их добавлению, то транзакции и не нужны.
Но если присутствует цикл select/update, да еще и в несколько потоков, то рано или поздно данные повредятся.

Простой случай, возьмем поле debit. Попробуем его увеличивать в несколько потоков без транцакций в цикле - select debit from mytable where ID=10, программно прибавляем единичку к полученному debit, затем делаем update mytable set debit=11 where ID=10. Результат приятно удивит.

Также можно обойтись и без транзакций (точнее использовать так называемые "оптимистические блокировки"), если с полем debit считывать, например, поле version -
select debit, version as oldversion from mytable where ID=10
. Тогда update будет выглядеть примерно так
update mytable set debit =11, version=version+1 where ID=10 and version=oldversion
. Но при этом придется всегда проверять, изменили ли мы данные или нет.

ЗЫ. По просьбам трудящихся, про оптимистические блокировки - https://ru.wikipedia.org/wiki/Блокировка_(СУБД)
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Единственное, что можно возразить, это то, что при использовании встроенных возможностей БД гораздо меньше кода - зачем писать то, что уже хорошо реализовано в БД?
А так, при полном покрытии кода тестами и нормальной архитектуре, большой разницы нет. Разве что писать транзакции на уровне приложения - это какое-то странное извращение. А вот без внешних ключей вполне можно обойтись. Я их всегда ставлю, но могу понять тех, кто на это забивает.
Ответ написан
@lega
Сделайте корректный семпл который "ломает" логику, например конкурентный запрос на двойное списание одних и тех же денег.

целостность должна контролироваться на уровне кода самого приложения.
Как они это контролируют?
Можно, но не для сложных транзакций.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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