次の項目では、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
を表示します。