Транзакция и хранимая процедура.Почему в этом случае таблица журнала пуста? - PullRequest
0 голосов
/ 23 ноября 2018

Я очень новичок в Mysql, возможно, не знаю или не понимаю чего-то существенного.

Не могли бы вы сообщить мне, почему "начать !!!"сообщение не вставлено в этот случай ?

DELIMITER $$

CREATE TABLE `_debugLogTable` (
  `Message` varchar(255) DEFAULT NULL
) ENGINE=InnoDB $$


CREATE PROCEDURE `debug_msg`(msg VARCHAR(255))
BEGIN
        insert into _debugLogTable select msg;
END$$


 CREATE FUNCTION `ValueMeetsCondition`(value varchar(20)) RETURNS tinyint(1)
BEGIN
    DECLARE ConditionValue INTEGER;

    call debug_msg('begin !!!');

    SET ConditionValue = CAST(`value` AS UNSIGNED);

    call debug_msg('end !!!');

    RETURN TRUE;
END$$

DELIMITER ;

Я знаю, что функция CAST не работает, но почему call debug_msg('begin !!!'); не вставляет новую запись в таблицу ?!Там нет никаких транзакций!

1 Ответ

0 голосов
/ 26 ноября 2018

Просто хочу опубликовать ответ, возможно, это поможет кому-то в будущем.Начиная с this мы имеем -

Если включен режим автоматической фиксации, каждый оператор SQL самостоятельно формирует одну транзакцию.По умолчанию MySQL запускает сеанс для каждого нового соединения с включенной автоматической фиксацией, поэтому MySQL выполняет коммит после каждого оператора SQL, если этот оператор не возвращал ошибку.Если инструкция возвращает ошибку, поведение фиксации или отката зависит от ошибки

Я вызываю функцию таким образом - select ValueMeetsCondition('>10').Так что на самом деле MySQL заключает транзакцию в транзакцию, поэтому, если что-то внутри моей процедуры завершается неудачей - все изменения откатываются.Если я переделаю свой запрос таким образом, будет вставлено сообщение begin !!, а end !! не

call debug_msg('begin !!!');

SET ConditionValue = CAST(`>10` AS UNSIGNED);

select ConditionValue;

call debug_msg('end !!!');
...