2011-12-12 98 views
7

我認爲這是真的,但我沒有在網上找到任何證實。我可以使用last_insert_id()獲取爲autoincrement字段生成的第一個id,但我可以假設下一個記錄將具有順序ID?或者另一個用戶可以抓取一個ID,以便生成的ID不是順序的?MySQL多行插入是否獲取順序自動增量ID?

實施例:插入MYTABLE(ASDF,QWER)值(1,2),(3,4),(5,6),...,(10000,10001);

如果MYTABLE有一個自動增量列,如果兩個用戶在同一時間運行該語句,將一個用戶搶10000個順序ID,以及其他用戶的下一個10000的連續ID?對於數百個用戶來說呢?

謝謝。

+1

這可能是真實的,但你有沒有這樣的保證,據我所知。 – Nanne

回答

9

這取決於所使用的存儲引擎。

  • 的MyISAM保證將插入的行具有順序編號的,因爲表級鎖插入期間舉行。
  • InnoDB:除非innodb_autoinc_lock_mode設置爲交錯(2),插入的行將具有順序ID's。默認情況下,自從5.1和traditional模式之前,InnoDB以consecutive模式運行。

欲瞭解更多的innodb_autoinc_lock_mode選項,看到13.6.4.3. AUTO_INCREMENT Handling in InnoDB

2

阿多行插入僅僅是一個大容量的操作,一遍遍執行相同的操作。 當insert語句被觸發時,它會觸發一個生成ID的觸發器。

因此,如果所使用的數據庫引擎,執行其所有工作在連續方式(隊列一樣 - 先入先出),然後是的,連續的ID會比以前更高的id一個增量;如果數據以多線程方式插入,並行觸發語句,那麼不會,「id」將以「random」給出。

我不知道,這保證任何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 –