事务和存储过程。为什么在这种情况下日志表为空?

时间:2018-11-23 14:03:17

标签: mysql sql transactions

我是Mysql的新手,可能不了解或不了解一些必不可少的内容。

能否请您告诉我为什么“开始!!!”消息未插入此 case

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 :(得分:1)

只想发布一个答案,也许将来会对别人有帮助。 在this中,我们有-

  

如果启用了自动提交模式,则每个SQL语句将自己形成一个事务。默认情况下,MySQL为每个启用了自动提交的新连接启动会话,因此,如果每个SQL语句未返回错误,则MySQL会在每个SQL语句之后进行提交。如果语句返回错误,则提交或回退行为取决于错误

我以这种方式调用函数-select ValueMeetsCondition('>10')
因此实际上它是由MySQL封装到事务中的,这就是为什么如果我的过程中的某些操作失败-会回滚整个更改。 如果我以这种方式重新进行查询,则会插入消息begin !!,而不会插入end !!

call debug_msg('begin !!!');

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

select ConditionValue;

call debug_msg('end !!!');