InnoDB でのエラー処理は、必ずしも
SQL
スタンダードに明記されている通りではありません。スタンダードによると、SQL
ステートメントでエラーが発生した場合は、その
SQL
ステートメントでロールバックを実行するように記述されています。InnoDB
では、ステートメントの一部のみ、またはトランザクション全体がロールバックされる事があります。
次の項目は、InnoDB
でのエラー処理の仕様を説明しています:
テーブルスペース内でファイル領域を使い果たすと、MySQL
の Table is full
エラーが発生し、InnoDB が SQL
ステートメントをロールバックします。
トランザクション
デッドロックが発生すると、InnoDB
がトランザクション全体をロールバックします。
ロック待ちタイムアウトが起きた場合は、InnoDB
は最新の SQL
ステートメントだけをロールバックします。
トランザクション
ロールバックが、デッドロックやロック待ちタイムアウトによって引き起こされると、それはトランザクション内のステートメントの効果をキャンセルします。しかし、トランザクション開始ステートメントが
START TRANSACTION か
BEGIN
ステートメントであると、ロールバックはこのステートメントをキャンセルしません。さらなる
SQL は、暗黙のコミットを引き起こす
COMMIT、ROLLBACK、またはいくつかの
SQL
ステートメントが発生するまでの間トランザクションの一部になります。
ステートメント内で IGNORE
オプションを指定しなければ、複製キー
エラーは SQL
ステートメントをロールバックします。
row too long error は SQL
ステートメントをロールバックします。
その他のエラーは主に MySQL のコード
レイヤ(InnoDB ストレージ
エンジン
レベルの上)によって検出され、対応する SQL
ステートメントがロールバックされます。ロックは単一
SQL
ステートメントのロールバック内でリリースされません。
暗黙のロールバックの最中に、明示的な
ROLLBACK SQL
コマンドの実行の最中と同じように、SHOW
PROCESSLIST は関連する接続の
State カラム内でRolling
back を表示します。
