2013-02-20 28 views
4

Test.id主鍵自動遞增可以在SQL插入多行得到滲透而過程

,而我插入使用這個SQL

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

如果有人使用

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

當過程剛完成插入「一」

將導致是(ID,姓名)

(1,a) , (2,b) , (3,c) , (4,d)

(1,a) , (2,d) , (3,b) , (4,c)

或其他

+0

願它取決於樣的表? MyISAM或InnoDB?我讀到'使用MyISAM之類的存儲引擎作用於分區表的INSERT語句會使用表級鎖來鎖定表的所有分區。這種情況不會發生在使用存儲引擎(例如使用行級鎖定的InnoDB)的表中。在http://dev.mysql.com/doc/refman/5.5/en/insert.html中 – fedorqui 2013-02-20 09:40:12

回答

2

默認情況下,大多數SQL引擎不支持Concurrent Inserts。但是,其中一些給了您在配置中允許的選項。

本身,插入是atomic聲明。這意味着數據庫將在插入之前被鎖定,並且僅在插入完成或失敗後才被解鎖。

例如,如果我寫這些語句,並在同一時間

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

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

什麼實際上發生的事情是race condition執行它們。所以,我的輸出可以是

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) 
0

你無法預知什麼事情發生 - 要麼選擇是可能的,這取決於誰早已執行過它。

當您創建AUTO_INCREMENT列時,它只保證它是唯一的 - 不能保證它到底是什麼,也不能保證它不會包含可能通過回滾創建的漏洞交易。