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;
いずれかの挿入に失敗すると、プロシージャによって行われたすべての変更がロールバックされ、終了します。