Как правильно делать в MySQL откат внепроцедурной транзакции в случае ошибки?
Приветствую. Ситуация такая. Клиентский код кладёт в базу в несколько разных таблиц исходные данные ("сырые исходные сообщения разных типов"), а потом в таблицу ("главная таблица") постобработанных сообщений одну запись ("постобработанное сообщение") на основе сырых. В таблицах сырых стоят указатели на id главной таблицы. И нужна транзакция на всё это.
Сперва хотел делать в хранимой процедуре, но по бизнес-логике возможно неограниченное количество сырых сообщений некоторых типов. Массивы передать в MySQL в процедуру нельзя, парсить текстовые строки - тоже не вариант.
В результате решил делать просто мульти-стейтмент запрос, который клиентский код сам и формирует.
И вот тут оказалось, что я не могу там откатить транзакцию в случае ошибки, поскольку объявлять хендлеры можно только внутри процедур. Так?
Более того, соединение с mysql-сервером долгоживущее (коннекшн-пул модуля nodejs) и авто-отката не происходит при обрыве.
Получается, вариант только один? Смотреть, вернулась ли ошибка в соединении и если да - либо рвать его, либо выполнять новым запросом "ROLLBACK;" сразу же?
Иначе в случае ошибки лочатся таблицы и всё. Наверное есть какие-то таймауты на транзакцию, но пока не нашёл, да и не хочется на них полагаться.
Алексей: Чуть позже выпилю пример из рабочего проекта, чтобы лишнее не мешало. Но, на самом деле, какие именно таблицы - не важно. Важно, что я не могу завернуть транзакцию в процедуру, потому что количество данных, которое пишется в таблицы разное, не фиксированное. Массив передать в хранимую процедуру я не могу, а это кстати был решило проблему. Поэтому я вообще вынужден отказаться от хранимой процедуры. И мне остаётся только в самом коде (в моём случае - nodejs) формировать строку с мультистейтментом SQL. Начиная с объявления транзакции ну и далее до комита. Так вот в этом случае я не могу SQL-ый хендлер на ошибку поставить, как это было бы внутри процедуры. Так что конкретика тут не важна...