【问题标题】:MySQL - If an insertion fails during a transaction, will an exception or warning ALWAYS be raised?MySQL - 如果在事务期间插入失败,是否总是会引发异常或警告?
【发布时间】:2016-06-03 00:56:39
【问题描述】:

我正在使用 MySQL Connector/Python 调用以下存储过程:

CREATE PROCEDURE AddDishReview
(
    id INT,
    OUT retVal TINYINT(1)
)
this_proc:BEGIN

    DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
    BEGIN
        ROLLBACK;
    END;

    START TRANSACTION;

    INSERT INTO Table1 VALUES (id);

    IF ROW_COUNT() < 1 THEN
        ROLLBACK;
        LEAVE this_proc;
    END IF;

    SET @table1RefID = LAST_INSERT_ID();
    INSERT INTO Table2 VALUES (@table1RefID);

    IF ROW_COUNT() < 1 THEN
        ROLLBACK;
        LEAVE this_proc;
    END IF;

    SET retVal = 1;
    COMMIT;
END //
DELIMITER ;

我的问题是,如果插入失败,是否会总是引发异常或警告(这又会触发退出处理程序)?我只是不禁觉得所有IF ROW_COUNT &lt; 1 检查都是不必要的。但我把它们放在那里是因为我不确定插入是否有可能在不引发异常/警告的情况下失败(这将导致执行继续并且ROW_COUNT 为 0)。

tl;dr:如果没有引发异常或警告,是否可以安全地假设插入成功?

【问题讨论】:

    标签: mysql stored-procedures transactions


    【解决方案1】:

    是的,如果插入语句失败,您将收到错误或警告。 sql mode setting 上的 Mysql 文档有一个很好的汇总表,它描述了您何时收到错误以及何时收到各种 sql 模式/忽略场景的警告。从链接表中可以看出,警告不会被忽略,但错误可能会减少为警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多