MySQL:在存储过程中使用事务、GET DIAGNOSTICS 和 SQLEXCEPTION SET 的正确方法

MySQL: Proper way to use transactions, GET DIAGNOSTICS, & SQLEXCEPTION SET in a Stored Procedure

提问人:Donavon Lerman 提问时间:9/8/2023 更新时间:9/8/2023 访问量:79

问:

我正在尝试在MySQL中创建一个存储过程,使用事务来捕获错误,显示错误,并在没有错误的情况下回滚或提交。这就是我想出的。它不显示错误或事务失败的原因。有什么建议吗?

Delimiter //

DROP PROCEDURE IF EXISTS TMP_SP_RunSQL //
CREATE PROCEDURE TMP_SP_RunSQL()
SP: BEGIN
        
       DECLARE `_rollback` BOOL DEFAULT 0;
       DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;

        /* Check Current Version of DB */
        IF TRUE THEN

         START TRANSACTION;


            /* This should cause an error. The `test` column has already been dropped */
            ALTER TABLE `Test`
              DROP COLUMN `test`;

        
            IF `_rollback` THEN
                GET DIAGNOSTICS CONDITION 1 @errorMessage = MESSAGE_TEXT;
                SELECT @errorMessage AS Message;
                SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @errorMessage;
                
                ROLLBACK;
                
                SELECT 'The database update failed' AS Message;
                
            ELSE
                COMMIT;
            
                SELECT 'The database update succeeded' AS Message;
            END IF;
        
        ELSE
            SELECT 'TMP_FN_CheckLkpVersion failed' AS Message;

        END IF;

END // 

DELIMITER ;


CALL TMP_SP_RunSQL();

DROP PROCEDURE IF EXISTS TMP_SP_RunSQL;

我创建了上述过程来获取诊断条件,并在其中放入一个名为 @errorMessage 然后显示该变量。

我期待看到:错误 1091,无法删除“测试”;检查列/键是否存在。

mysql stored-procedures 事务 提交 回滚

评论

0赞 wchiquito 9/9/2023
检查导致隐式提交的 13.3.3 语句。请参见dbfiddle without transaction。

答: 暂无答案