挿入失敗時の MySQL の自動インクリメント動作
MySQL の一意のインデックスは、重複エントリを防止することでデータの整合性を確保します。しかし、一意キー違反により挿入が失敗すると、予期しない結果が発生します。つまり、挿入の失敗にもかかわらず自動インクリメント値が増加します。
InnoDB のトランザクションの性質を理解する
MySQL の InnoDB ストレージエンジンはトランザクション的に動作します。トランザクションでは、複数の操作がアトミックに実行され、すべての操作が成功するか、何も成功しないかのどちらかが保証されます。
自動インクリメント ロック メカニズム
最後まで保持される他のトランザクションの側面とは異なります。トランザクションの自動インクリメント カウンタは特別なテーブル レベルのロックを使用します。このロックは、トランザクションではなく、現在の SQL ステートメントの終了時に解放されます。
この設計により、挿入操作の同時実行性が向上します。ロックを短時間だけ保持することで、複数のセッションが一意の値を維持しながら、同時に異なる行にレコードを挿入できます。
潜在的な結果
自動インクリメント値のギャップを回避することが望ましいように思えるかもしれませんが、 , InnoDB はギャップを許容することで同時実行性を優先します。その結果、悪意のある攻撃者がテーブルに失敗した挿入リクエストを大量に送り込み、自動インクリメント値を急速に増加させる可能性があります。
軽減策
この脆弱性を軽減するには、次の使用を検討してください。自動インクリメント フィールドの BIGINT (8 バイト) データ型。潜在的なラップアラウンドの前に、より広い範囲の値を提供します。
が発生します。以上が挿入が失敗した後も MySQL の自動インクリメントが継続されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。