2016-06-03 8 views
0

Ich verwende MySQL Connector/Python die folgende gespeicherte Prozedur aufzurufen:MySQL - Wenn eine Einfügung während einer Transaktion fehlschlägt, wird IMMER eine Ausnahme oder Warnung ausgelöst?

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 ; 

Meine Frage ist, wenn eine Einfügung fehlschlägt, wird es immer eine Ausnahme oder Warnung ausgelöst werden (das würde wiederum Trigger der Exit-Handler)? Ich kann einfach nicht helfen, aber ich habe das Gefühl, dass alle IF ROW_COUNT < 1 Checks unnötig sind. Aber ich habe sie dort eingefügt, weil ich nicht sicher war, ob ein Einfügen fehlschlagen konnte, ohne eine Ausnahme/Warnung auszulösen (was dazu führen würde, dass die Ausführung fortgesetzt würde und ROW_COUNT von 0).

tl; dr: Ist es sicher anzunehmen, dass, wenn keine Ausnahme oder Warnung ausgelöst wird, die Einfügung erfolgreich war?

Antwort

0

Ja, Sie erhalten entweder einen Fehler oder eine Warnung, wenn eine INSERT-Anweisung fehlschlägt. Mysql Dokumentation auf sql mode setting hat eine nette Übersichtstabelle, die beschreibt, wenn Sie einen Fehler erhalten und wenn Sie eine Warnung für verschiedene Sql-Modus/Ignore-Szenarien erhalten. Wie Sie aus der verknüpften Tabelle sehen können, wird keine Warnung jemals ignoriert, aber Fehler können auf Warnungen reduziert werden.