@constintmid
Laravel vue.js

Как вы относитесь к использованию транзакций в Laravel?

Как вы относитесь к использованию транзакций в Laravel?
Скажем есть важная информация и чтобы ее не потерять использовать транзакции для повторного пересохранения насколько это правильно с точки проектирования
Для примера такой подход
try {
    DB::transaction(function() {
        // ... снова и снова
    }, 3);  // Повторить три раза, прежде чем признать неудачу
} catch (ExternalServiceException $exception) {
    return 'Извините, внешняя служба не работает, а вы не сможете завершить регистрацию без ключей от нее'.
}
  • Вопрос задан
  • 439 просмотров
Решения вопроса 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
Мы на проекте решили использовать транзакции везде, кроме роутов только на выборку. В том числе и в джобах.

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

Есть минус - дедлоки. По-нормальному это решается какой-нибудь doctrine, либо повтором транзакций (если реально), либо фиксами долгих транзакций.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@vism
Использовать надо, другие описали, а еще я бы добавил, что помимо транзакции в операции могут быть events, которые тоже надо откатить (не выполнять).
Для этого используется пакет
https://github.com/fntneves/laravel-transactional-...
Ответ написан
@xfg
Транзакции повторяют из-за дедлоков. Это такое состояние, когда одновременно выполняются 2 транзакции и первая транзакция блокирует запись, которая нужна второй транзакции, а вторая транзакция блокирует запись, которая нужна первой транзакции. В итоге ни одна из транзакций не может завершиться. Это состояние называется deadlock. В этом случае одна из транзакций должна откатиться, чтобы другая имела возможность успешно завершиться. Так вот, эта транзакция, которую откатили попробует еще 3 раза выполниться, прежде чем окончательно вылетит с исключением.

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

Вообще на более продвинутом уровне принято сохранять не более одной сущности (объекта) внутри одной транзакции. Таким образом вы получаете худые транзакции и отсутствие дедлоков. Производительность вашего приложения возрастет, но вместе с тем, вы получите проблему атомарного сохранения нескольких сущностей (объектов) в рамках одной бизнес-операции как это происходит в микросервисной архитектуре. Проблему можно решить использованием шаблона saga, но в целом это уже совершенно иной уровень знаний и вникать в это наверное не стоит, если вы делаете что-то небольшое.
Ответ написан
@Karpion
Необходимость использовать транзакции - определяется задачей, а не средствами её решения.

У транзакций есть два свойства:
  1. Транзакция либо доходит до конца, либо как будто не начинала выполняться (реально - она начинает что-то делать, но это инвариантно тому, как будто она ничего не сделала; а в какой-то момент она оказывается сделанной целиком). Это нужно при работе с энергонезависимым накопителем - на случай сбоя питания.
  2. Транзакция не позволяет никому трогать те элементы, которые она использует. Ну как "никому"... другим транзакциям... просто никто третий туда залезть не может. Это нужно при работе многих потоков с одной БД.
И если нужно хотя бы одно из этих свойств - то транзакции нужны. А при однопоточной работе с данными в памяти - не нужны.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы