私は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 !!!');
新しいレコードをテーブルに挿入しないのですか?!そこには取引はありません!
答えを投稿したいだけです。将来誰かに役立つかもしれません。この私たちは持っています-
自動コミットモードが有効になっている場合、各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 !!!');
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加