4

Test.id主キーで、自動インクリメント

このSQLを使用して挿入している間

 INSERT INTO Test (id,name) values (null, "a") , (null, "b") , (null, "c")

誰かが使うなら

 INSERT INTO Test (id,name) values (null, "d")

プロセスがちょうど挿入を終了している間、「a」

は(id、name)

(1,a) , (2,b) , (3,c) , (4,d)
または
(1,a) , (2,d) , (3,b) , (4,c)

その他になります

4

2 に答える 2

2

ほとんどの SQL エンジンは、既定では同時挿入をサポートしていません。ただし、それらの一部は、構成でそれを許可するオプションを提供します。

挿入自体はアトミックステートメントです。つまり、挿入前に DB がロックされ、挿入が完了または失敗した後にのみロックが解除されます。

たとえば、これらのステートメントを作成して同時に実行するとします。

INSERT INTO Test VALUES(null, 'a'), (null, 'b'), (null, 'c'), (null, 'd')

INSERT INTO Test VALUES(null, 'e'), (null, 'f')

基本的に発生するのは競合状態です。したがって、私の出力は次のいずれかになります

1 a, 2 b, 3 c, 4 d, 5 e, 6 f

また

1 e, 2 f, 3 a, 4 b, 5 c, 6 d

INSERT SELECT ステートメントを使用することもでき、ステートメントが完全に完了するまでデータベースをロックします。

INSERT INTO Test select * from test2

したがって、あなたの場合、最初のクエリの実行が開始されると、次のクエリは待機する必要があるため、出力は次のようになります

(1,a) , (2,b) , (3,c) , (4,d)
于 2013-02-20T09:45:28.277 に答える
0

何が起こるかを予測することはできません-誰が以前にそれを実行したかに応じて、どちらの選択も可能です。

AUTO_INCREMENT列を作成したとき、それは一意であることが保証されているだけです。正確に何になるかは保証されておらず、ロールバックされたトランザクションによって作成される可能性のある穴が含まれていないという保証もありません。

于 2013-02-20T09:38:55.367 に答える