一連の MySQL コマンドを実行する場合、データの整合性を確保するためにエラーを処理することが重要です。これを実現する 1 つの方法は、コマンドで例外が発生した場合にトランザクション全体を自動的にロールバックすることです。
自動ロールバックを設定するには、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 ;
このプロシージャは、SQL 例外が発生した場合に _rollback フラグを 1 に設定するハンドラ (CONTINUE HANDLER FOR SQLEXCEPTION) を定義します。トランザクション内の個々のコマンドを実行した後、_rollback フラグをチェックして、トランザクションをロールバックするかコミットするかを決定します。
この手法を実装すると、コマンドの実行中に例外が発生すると、トランザクション全体がロールされます。部分的な変更がデータベースに適用されないようにします。
以上が例外時に MySQL トランザクションを自動的にロールバックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。