例外時の 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 サイトの他の関連記事を参照してください。