mysql中的LAST_INSERT_ID()分析

mysql中的LAST_INSERT_ID()分析

 

今天跟人討論php高並發下的LAST_INSERT_ID的正確性問題,一開始大傢都比較模糊,後來經過大傢共同查詢資料,對這個問題有瞭比較清晰的瞭解,特發此文,以為紀念。

 

首先看mysql中的LAST_INSERT_ID()的官方說法:
 

LAST_INSERT_ID()自動返回最後一個INSERT或UPDATE查詢中AUTO_INCREMENT列設置的第一個表發生的值。

MySQL的LAST_INSERT_ID的註意事項:
 

第一、查詢和插入所使用的Connection對象必須是同一個才可以,否則返回值是不可預料的。

第二、LAST_INSERT_ID是與表無關的,如果向表a插入數據後再向表b插入數據,LAST_INSERT_ID返回表b的Id值。  www.aiwalls.com  

第三、假如你使用一條INSERT語句插入多個行,  LAST_INSERT_ID() 隻返回插入的第一行數據時產生的值。

第四、假如你使用 INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT 計數器不會增量,而 LAST_INSERT_ID() 返回0, 這反映出沒有插入任何記錄。

 

根據這四條原則,我們討論的高並發網站訪問時的插入後取自增長值其實主要是跟第一條規則和第二條規則有關。即要保證LAST_INSERT_ID的正確性,必須同一個connection,並且LAST_INSERT_ID要緊跟在insert中執行。所以如果是數據庫緩存池公用connection可能會出問題,多線程操作在insert後面由執行瞭別的insert時也會出問題。

 

而php的數據庫連接本身是頁面級的,這樣就保證瞭不會出現緩沖池的情況,然後php頁面執行本身也是單線程的,這樣就保證瞭順序編寫的LAST_INSERT_ID肯定是緊跟在insert之後執行的,中間不會有別的insert執行。  www.aiwalls.com  

 

綜上所述,php的頁面級、單線程其實已經保證瞭mysql的LAST_INSERT_ID天然就是正確的,跟高並發並沒有關系。即php中,mysql的LAST_INSERT_ID總是正確的,隨便用把,沒有問題的。

 

 

作者 趙開錦

發佈留言