MySQL 8.0 リファレンスマニュアル


15.21.4 InnoDB のエラー処理

次の項目では、InnoDB がエラー処理を実行する方法について説明します。 InnoDB では、失敗したステートメントのみがロールバックされ、それ以外の場合はトランザクション全体がロールバックされることがあります。

  • テーブルスペース内のファイル領域が不足した場合は、MySQL の Table is full エラーが発生し、InnoDB は SQL ステートメントをロールバックします。

  • トランザクションデッドロックが発生すると、InnoDBトランザクション全体をロールバックします。 これが発生したら、トランザクション全体を再試行します。

    ロック待機タイムアウトが発生すると、InnoDB は現在のステートメント (ロックを待機していてタイムアウトが発生したステートメント) をロールバックします。 トランザクション全体をロールバックするには、--innodb-rollback-on-timeout を有効にしてサーバーを起動します。 デフォルトの動作を使用する場合はステートメントを再試行し、--innodb-rollback-on-timeout が有効な場合はトランザクション全体を再試行します。

    デッドロックとロック待機のタイムアウトはどちらもビジー状態のサーバーでは通常のことであり、アプリケーションはそれらが発生する可能性を認識し、発生した場合は再試行によって処理する必要があります。 トランザクション中の最初のデータ変更からコミットまでの間に行う作業をできるだけ少なくして、ロックが可能性のある最短の時間、可能性のある最少の行数に対して保持されるようにすることにより、それらが発生する可能性を少なくすることができます。 場合によっては、異なるトランザクション間での作業の分割が実際的で、かつ役立つことがあります。

  • ステートメントで IGNORE オプションを指定していない場合、重複キーエラーは SQL ステートメントをロールバックします。

  • row too long error は、SQL ステートメントをロールバックします。

  • その他のエラーはほとんど (InnoDB ストレージエンジンレベルの上にある) コードの MySQL レイヤーによって検出され、対応する SQL ステートメントをロールバックします。 1 つの SQL ステートメントのロールバックでは、ロックは解放されません。

暗黙的なロールバック中や、明示的な ROLLBACK SQL ステートメントの実行中に、SHOW PROCESSLIST は、関連する接続の State カラムに Rolling back を表示します。


関連キーワード:  InnoDB, テーブル, 構成, ステートメント, ロック, トランザクション, スペース, 圧縮, インデックス, INFORMATION