2011-04-22 88 views
2

我需要知道該記錄的id(並保留它),因爲我添加一個產品並上傳此產品的圖像,所以在插入它之前我會在數據庫中插入該記錄,圖像的位置與產品ID相關。插入之前的MySQL-id「保留」

我可以找到會跟隨的ID,但我也需要保持它「鎖定」,直到產品圖像上傳,以確保此ID不被其他用戶使用。

回答

4

您可以將其分成兩個操作。

在第一次爲產品創建所有內容並獲取ID。在第二步中,您會更新包含您上傳的圖片的行,因爲您知道該ID,所以現在可以保存該圖片。

+4

爲了安全起見,請在事務內部執行此操作,以便在過程的圖像處理部分出現問題時回滾初始插入。 – 2011-04-22 20:54:48

0

ID保留了很多的教程才能安全進行如果你有自己的自動增量實現。即使在交易中運行,您也無法確定下一個ID是什麼。你只需要確定你的要求就可以了。

有些人使用mysql_insert_id接收最後插入的ID。但我在某處牢記這個函數不是線程安全的,你可能會得到剛剛插入的另一個線程的ID。

然而,在你的情況下,只有兩種選擇來我的腦海:

1)創建own sequence generator 2)插入您的數據行,在where子句中的所有值再次選擇它,並使用該ID。在交易中運行選項2(如上所述)

我會選擇1.序列生成通常用於所有其他數據庫(從廣泛使用的只有mysql支持自動增量,據我所知)。因此序列完全可以接受。

乾杯,基督教

+2

其實我認爲mysql_insert_id - 獲取在最後一個查詢中生成的ID,並且是按每個連接生成的。 「生成的最後一個ID在每個連接的基礎上保存在服務器中,這意味着函數返回給定客戶端的值是該客戶端生成的最新AUTO_INCREMENT值,該值不會受到其他客戶端的影響,即使它們生成自己的AUTO_INCREMENT值,這種行爲可以確保您可以檢索自己的ID,而不用擔心其他客戶端的活動,也無需鎖定或事務。 – morandi3 2011-04-23 10:34:25

0

我需要幾乎相同的東西 - 除目錄依賴。

我想插入帶有會話ID的圖像,然後當提交表單時,使用相同的會話ID更新圖像並添加到父元素ID。

+0

問題在於如果您在同一個會話中添加更多內容 - 它們會被擰緊。如果每次顯示錶單時重新生成會話標識,並且表單驗證失敗,則重新生成會話標識並丟失已上傳的圖像。 – 2012-05-15 06:55:55