ホームページ > データベース > mysql チュートリアル > 例外時に MySQL トランザクションを確実にロールバックするにはどうすればよいですか?

例外時に MySQL トランザクションを確実にロールバックするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-26 00:35:12
オリジナル
198 人が閲覧しました

How Can I Ensure MySQL Transaction Rollback on Exception?

例外時の MySQL トランザクション ロールバック

トランザクション内のすべての MySQL コマンドが正常に実行されるか、トランザクション全体がロールバックされることを確認したい場合何らかのエラーが発生した場合。一般的なアプローチには、エラー処理を備えた try/catch ブロックまたはストアド プロシージャを使用することが含まれます。ただし、より汎用性の高いオプションは、MySQL の DECLARE ... HANDLER 構文を利用することです。

DECLARE ... HANDLER 構文を使用すると、指定された SQL 例外が発生したときに実行されるハンドラーを定義できます。この機能を利用すると、エラーが発生したときにトランザクションを自動的にロールバックするように MySQL を構成できます。

実装方法は次のとおりです:

DELIMITER $$

CREATE PROCEDURE `sp_fail`()
BEGIN
    DECLARE `_rollback` BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
    START TRANSACTION;
    INSERT INTO `tablea` (`date`) VALUES (NOW());
    INSERT INTO `tableb` (`date`) VALUES (NOW());
    INSERT INTO `tablec` (`date`) VALUES (NOW()); -- FAIL
    IF `_rollback` THEN
        ROLLBACK;
    ELSE
        COMMIT;
    END IF;
END$$

DELIMITER ;
ログイン後にコピー

この例では、' という名前のストアド プロシージャが使用されます。 sp_fail' は、SQL 例外のハンドラーを使用して作成されます。トランザクションの実行中に例外が発生した場合、ハンドラーは「_rollback」フラグを「1」に設定します。すべての SQL ステートメントが実行された後、IF ステートメントは '_rollback' の値をチェックします。 「1」の場合、トランザクションは ROLLBACK ステートメントを使用してロールバックされます。それ以外の場合、トランザクションは COMMIT ステートメントを使用してコミットされます。

この手法を利用すると、MySQL トランザクションが完全に実行されるか完全にロールバックされ、部分的な更新やデータの不整合を防ぐことができます。

以上が例外時に MySQL トランザクションを確実にロールバックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート