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

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

Patricia Arquette
リリース: 2024-11-26 07:30:14
オリジナル
340 人が閲覧しました

How Can MySQL Transactions Be Automatically Rolled Back on Exception?

データの整合性の保護: 例外発生時の MySQL トランザクションのロールバック

データベース管理の重要な原則の 1 つは、データの整合性と一貫性を維持することです。 。トランザクションは、複数のデータベース操作が完全にコミットされるか、エラーが発生した場合にロールバックされるかを保証する上で重要な役割を果たします。

課題: エラー時の自動ロールバック

検討してください次のシナリオ: 一連の MySQL コマンドがトランザクション内で実行されます。ただし、コマンドの 1 つ (たとえば 2 番目のコマンド) でエラーが発生しました。予期される動作は、トランザクション全体が失敗してロールバックし、不完全なデータがデータベースに書き込まれるのを防ぐことです。ただし、エラーによってトランザクションがロールバックされるわけではないことが確認されました。

解決策: DECLARE ... HANDLER 構文

この課題を処理するために、MySQL は以下を提供します。 DECLARE ... HANDLER 構文。これを使用すると、さまざまな種類の例外に対するカスタム ハンドラーを定義できます。この構文を使用すると、エラーが発生した場合にトランザクションを自動的にロールバックできます。

次のコード スニペットは、DECLARE ... HANDLER 構文を利用して自動ロールバックを実現する方法を示しています。

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 ;
ログイン後にコピー

このコードでは、DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ステートメントを使用してカスタム ハンドラーが宣言されています。 SQL 例外が発生すると、_rollback 変数は 1 に設定され、トランザクションをロールバックする必要があることを示します。最後の IF ... THEN ... ELSE ステートメントは、_rollback の値をチェックし、それに応じて ROLLBACK または COMMIT を実行します。

このアプローチを使用すると、トランザクションの実行中にエラーが発生すると、ロールバックして、データベースが一貫性のある有効な状態に保たれるようにします。

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

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