データの整合性の保護: 例外発生時の 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 サイトの他の関連記事を参照してください。