2011-05-08 80 views
11

我一直在琢磨這一段時間。MySQL和PDO:可能PDO :: lastInsertId理論上失敗?

考慮巨大的比例,在那裏,讓我們說,數以百萬計的SQL查詢的Web應用程序中執行的每一秒。後立即

$q = $db->prepare('INSERT INTO Table 
       (First,Second,Third,Fourth) 
      VALUES (?,?,?,?)'); 
$q->execute(array($first,$second,$third,$fourth)); 

然後,我想取自動遞增的這最後詢問的ID:

我跑我的代碼

$id = $db->lastInsertId(); 

是否有可能爲lastInsertId失敗,即取一些SQL插入查詢的ID在之間我的兩個代碼塊?

中學:

如果它失敗了,這將是堵塞這可能泄漏的最好方法?

難道是安全創建另一個SQL查詢從數據庫中獲取正確的ID,只是要確定?

回答

18

它永遠是安全的前提是PDO實現不是做一些真正的骨領導。以下是關於last_insert_id上的MySQL信息:

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

+0

好吧,當場。謝謝! – Mattis 2011-05-09 11:17:34

4

編號lastInsertId是每個連接,並且不需要對服務器的請求 - mysql總是將它發送回它的響應數據包。

因此,如果執行方法不拋出一個異常,那麼你肯定可以在lastInsertId正確的價值。

它永遠不會給你任何東西插入ID,除非您的查詢失敗由於某種原因(如無效的語法)在這種情況下,它可能給你從相同的連接上的前一個插入ID。但不是別人的。

+1

真棒標記,然後我感到安全:) – Mattis 2011-05-09 11:17:55