これは、InnoDBでの自動インクリメントロックの例です。同じセッションで2つのステートメントを同時に実行している場合、自動インクロックは最初のクエリによって取得され、自動インクリメント値の生成はステートメント間でインターリーブされません。つまり、要点です。トランザクションの。
これは常に設計によって発生します。そうでない場合、InnoDBのトランザクションが機能する方法は機能しません。 OLTPタイプのロードでのスケーラビリティは、すべての挿入が他のすべての挿入が終了するか、コミットされるか、さらに悪いことにロールバックされるまで待機する必要があるため、ひどいものになります。
つまり、最初の挿入が2番目の挿入より5倍長く実行され、失敗してロールバックされた場合でも、2番目の挿入は完了してコミットされています。そうでなければ、あなたはeaを待たなければならないでしょう。次々に完了するクエリ。
シーケンシャルで完全に一意のID番号が必要な場合は、別のソースからプルしてください。 AutoInc列は、シリアル化のポイントでありボトルネックである一意の値(必ずしもモノシーケンスである必要はありません)を保証するだけです。
特に必要な場合は、これを回避する1つの方法:
innodb_autoinc_lock_mode = 0
を設定します my.cnf / mysql.ini