gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:26:29 25 4
gpt4 key购买 nike

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

最佳答案

只是想发布一个答案,也许它会在将来帮助某人。来自 this我们有 -

If autocommit mode is enabled, each SQL statement forms a single transaction on its own. By default, MySQL starts the session for each new connection with autocommit enabled, so MySQL does a commit after each SQL statement if that statement did not return an error. If a statement returns an error, the commit or rollback behavior depends on the error

我以这种方式调用函数 - select ValueMeetsCondition('>10')
所以实际上它被 MySQL 包装到事务中,这就是为什么如果我的过程中的某些东西失败了——整个更改都是回滚的。如果我以这种方式重新查询,消息 begin !! 将被插入,而 end !! 则不会

call debug_msg('begin !!!');

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

select ConditionValue;

call debug_msg('end !!!');

关于mysql - 事务和存储过程。为什么在这种情况下日志表是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53448131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com