我是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 !!!');
不会在表中插入新记录?那里没有任何交易!
答案 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 !!!');