Я прочитал документацию по обработчикам выходов и нашел полезные идеи кода в соответствующих вопросах SO здесь и здесь среди других мест.
Тем не менее, вызов хранимой процедуры, представленной ниже, кажется, завершает OK и возвращает значение TRUE для параметра success
. когда я знаю, что он определенно не завершает OK, не в последнюю очередь потому, что в теле была синтаксическая ошибка SQL (это относилось к несуществующему полю).
Поэтому обработчик выхода должен был запустить в и вернул FALSE для параметра success
.
Может кто-нибудь помочь мне понять, почему неудачная транзакция не возвращает правильное значение для параметра? (Я подозреваю, что это как-то связано с тем, где я установил success
в true)
Фактический SQL внутри транзакции не важен для этого вопроса, поэтому я его не показывал. Просто предположите, что он может или не может успешно завершить транзакцию. Это успех или неудача этой транзакции, которую я хочу обнаружить с помощью параметра
DELIMITER $$
CREATE PROCEDURE do_thing (OUT success BOOLEAN)
DETERMINISTIC
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET success := FALSE; ROLLBACK; END; # rollback on any error
DECLARE EXIT HANDLER FOR SQLWARNING BEGIN SET success := FALSE; ROLLBACK; END; # rollback on any warning
START TRANSACTION;
< SQL that might cause an error >
< in my case it was referring to a field that didn't exist>
COMMIT;
SET success := TRUE;
END$$
DELIMITER ;