Транзакции и блокировки
Транзакции управляются методами startTransaction(), commitTransaction() и rollbackTransaction() объекта соединения, поддерживая вложенность через точки сохранения (SAVEPOINT). Для предотвращения параллельного запуска критичных фоновых процедур используются блокировки Connection::lock(), а внешние сетевые вызовы и отправку писем необходимо выносить за пределы транзакции.
Прогресс хранится в этом браузере. Войдите, чтобы сохранить его в аккаунте.
Что нужно понимать
-
1
Начало и завершение транзакции
-
2
Откат транзакции
-
3
Вложенные транзакции
Материалы
Официальная документация
Проверь себя
Сервис заказа открывает транзакцию, внутри вызывает сервис оплаты, который на ошибке делает rollbackTransaction() и ловит исключение. Что происходит с данными?
Внутренний rollbackTransaction() откатывает только до SAVEPOINT и бросает TransactionException. Если внутренний код его проглотил, внешняя транзакция дойдёт до commitTransaction() и сохранит всё, что было до вложенной. Решать, откатывать ли целиком, должен внешний код.
Почему commitTransaction() внутри вложенной транзакции ничего не пишет в базу?
MysqlCommonConnection считает уровень вложенности: startTransaction() на уровне выше нуля ставит SAVEPOINT, а COMMIT уходит в базу только когда уровень вернулся к нулю. Вложенный коммит лишь уменьшает счётчик.
Заказчик жалуется, что при импорте из 1С по cron заказы иногда дублируются. При чём тут блокировки?
Два запуска импорта пересеклись. Транзакция не мешает второму процессу начать ту же работу; нужна именованная блокировка Connection::lock() с проверкой результата, и выход, если её не удалось получить. Не забыть unlock() в finally.
Чем плоха транзакция, внутри которой отправляется письмо и делается запрос к внешнему API?
Транзакция держит блокировки строк всё время запроса к API. При таймауте на той стороне другие процессы ждут, и растёт риск взаимных блокировок. Внешние вызовы выносят за commitTransaction().
Не сходится?
Спросите ассистента BXMax: он знает документацию и материалы сайта по этой теме.
Знаете материал лучше?
Предложите ссылку: после проверки она появится в этом разделе.
Войти, чтобы предложить