MySQL トランザクション処理: 例外時のロールバック
MySQL のコンテキストでは、トランザクションには、トランザクションとして実行される一連のデータベース操作が含まれます。単一の論理ユニット。デフォルトでは、トランザクション内のコマンドのいずれかでエラーがスローされた場合、トランザクション全体がロールバックされ、データの整合性が確保されます。ただし、ロールバック動作を明示的に制御したい場合があります。
例外で自動ロールバックを実現する 1 つの方法は、MySQL の DECLARE ... HANDLER 構文を使用することです。これにより、ユーザーは、トランザクションの実行中に SQLEXCEPTION が発生した場合に実行されるハンドラー関数を指定できます。
これがどのように機能するかを示すために、次の例を考えてみましょう。
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 ;
このプロシージャでは、エラーが発生した場合にフラグを立てる変数 _rollback を宣言します。ハンドラーは、SQLEXCEPTION が発生したときにこのフラグを 1 に設定するように定義されています。次に、トランザクション内で必要なデータベース操作を実行します。すべての操作が試行された後、_rollback フラグをチェックし、エラーが発生した場合にのみ ROLLBACK を発行します。それ以外の場合は、トランザクションを COMMIT します。
この手法を使用すると、トランザクション レベルのエラーが発生した場合にロールバックがトリガーされ、データベースを一貫した状態に保つという望ましい動作が維持されます。
以上がMySQL トランザクションの例外に対する自動ロールバックを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。