Как правильно делать в MySQL откат внепроцедурной транзакции в случае ошибки?

Приветствую. Ситуация такая. Клиентский код кладёт в базу в несколько разных таблиц исходные данные ("сырые исходные сообщения разных типов"), а потом в таблицу ("главная таблица") постобработанных сообщений одну запись ("постобработанное сообщение") на основе сырых. В таблицах сырых стоят указатели на id главной таблицы. И нужна транзакция на всё это.

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

В результате решил делать просто мульти-стейтмент запрос, который клиентский код сам и формирует.

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

Более того, соединение с mysql-сервером долгоживущее (коннекшн-пул модуля nodejs) и авто-отката не происходит при обрыве.

Получается, вариант только один? Смотреть, вернулась ли ошибка в соединении и если да - либо рвать его, либо выполнять новым запросом "ROLLBACK;" сразу же?

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

Или не так?
  • Вопрос задан
  • 444 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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