MySQL エラーコードを呼び出し元に渡します。このエラーコードに基づいて、呼び出し元は、その時点までに実行された作業をコミットするかどうかを自由に決定できます(この特定のINSERTのエラーは無視してください)。 ステートメント)またはトランザクションをロールバックします。
これはPostgreSQLとは異なります これは常にエラー時にトランザクションを中止し、この動作は多くの問題の原因になります。
更新:
無条件のROLLBACKを使用することは悪い習慣です ストアドプロシージャの内部。
ストアドプロシージャはスタック可能であり、トランザクションはスタック可能ではないため、ROLLBACK ネストされたストアドプロシージャ内では、ストアドプロシージャの実行状態ではなく、トランザクションの最初にロールバックされます。
トランザクションを使用してエラー時にデータベースの状態を復元する場合は、SAVEPOINTを使用します コンストラクトとDECLARE HANDLER セーブポイントにロールバックするには:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
いずれかの挿入に失敗すると、プロシージャによって行われたすべての変更がロールバックされ、終了します。