2011-12-12 11 views
7

これは真実だと思いますが、ウェブ上で確認するためのものは見つかりませんでした。 last_insert_id()を使用してautoincrementフィールドのために生成された最初のIDを取得できますが、次のレコードにシーケンシャルIDがあると仮定できますか?あるいは、別のユーザーがIDを取得して結果IDが連続しないようにすることはできますか?MySQLの複数行の挿入は連続した自動インクリメントIDを取得しますか?

例:MYTABLEに挿入(ASDF、QWER)値(1,2)、(3,4)、(5,6)、...、(10000,10001)。

mytableにautoincrementカラムがあり、2人のユーザーが同時にこのステートメントを実行すると、1人のユーザーが10000個の連続IDを取得し、他のユーザーが次の10000個の順次IDを取得しますか?何百人ものユーザーはどうですか?

ありがとうございました。

+1

を参照してください、しかし、あなたは私の知る限りではそのような保証を持っていません。 – Nanne

答えて

9

これは、使用されるストレージエンジンに依存します。テーブル・レベルのロックが挿入中に保持されているので

  • のMyISAMは、シーケンシャルなIDを持って挿入された行を保証します。
  • のInnoDBinnodb_autoinc_lock_modeインターリーブ(2)に設定されていない限り、挿入された行が順次IDを有することになります。デフォルトでは、InnoDBはモードが5.1とtraditionalより前にconsecutiveモードで実行されます。 innodb_autoinc_lock_modeオプションの詳細については

、それは本当かもしれない13.6.4.3. AUTO_INCREMENT Handling in InnoDB

2

複数行の挿入は何度も何度も同じ操作を行うだけでバルク操作です。 insertステートメントが起動されると、IDを生成するトリガーが起動します。

したがって、データベースエンジンを使用してすべての作業をシーケンシャルな方法(先入れ先出しのようなキュー)で実行すると、順次IDは前のIDよりも1桁高くなります。文が並列に実行されるマルチスレッドの方法でデータが挿入されている場合、IDは「ランダム」で与えられます。

私はこのことを保証するすべてのmysqlエンジンについて認識していませんが、再びこの特定のテーマで多くの研究を行っていません。

4

LOCK TABLESを使用する場合、バッチは順次IDを取得する必要があります。

例:

LOCK TABLES users WRITE; 
<BULK INSERT HERE> 
UNLOCK TABLES; 

これは同時にテーブルへの書き込みが複数のスレッドを防ぐことができます。

+0

innodbエンジンに 'LOCK TABLES ..'を使用できますか? – stack

+0

はい - LOCK TABLESはInnoDBと連携します - ロックアウトのドキュメントをチェックアウトしてください:https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html –

関連する問題