2013-03-23 90 views
-2

我在MySQL數據庫中的註冊程序和它的工作原理是這樣的:LAST_INSERT_ID函數會失敗嗎?

INSERT INTO `tblusers` (`uname`, `upwd`, `umail`) VALUES (RU_UNAME, RU_UPWD, RU_UMAIL); 
select LAST_INSERT_ID() into @newuserid; 

-- then use the @newuserid to make some work on other tables. 

現在我想知道它永遠不會得到錯誤ID專門數據庫將有很多其他表的插入,那麼它可能會得到插入用戶和獲取最後插入的ID之間插入的另一個表的ID?

有沒有失敗的機會?

回答

1

總之,沒有。與數據庫的不同連接維護自己的獨立LAST_INSERT_ID。因此,其他客戶將記錄插入tblusers不會影響您的LAST_INSERT_ID

documentation

已生成被保持在基於每個連接的基礎上的服務器的ID。這意味着該函數返回給定客戶端的值是爲該客戶端影響AUTO_INCREMENT列的最新語句生成的第一個AUTO_INCREMENT值。即使它們生成自己的AUTO_INCREMENT值,該值也不會受到其他客戶端的影響。此行爲可確保每個客戶端都可以檢索自己的ID,而不必關心其他客戶端的活動,而無需鎖定或事務。

documentation值得一讀。它詳細闡述了一些事情。

0

MySQL使用鎖定系統,它不允許2個進程(2個腳本調用)修改同一行。所以表不會崩潰*,但是MySQL可能無法在合理的時間內處理請求的數量,並且請求會等待。您應該始終儘可能快地優化您的查詢。

所以,最後插入的ID不會失敗。