這可能不是現實世界的問題,但更像是一個學習主題。手動增加主鍵 - 交易和競速條件
使用PHP,MySQL和PDO,我知道所有關於auto_increment和lastInsertId()的內容。考慮到主鍵沒有auto_incerment屬性,我們必須使用類似SELECT MAX(id) FROM table
的東西來檢索最後一個ID,手動增加它,然後INSERT INTO table (id) VALUES (:lastIdPlusOne)
。將整個代碼包裝在beginTransaction
和commit
中。
這種方法安全嗎?如果用戶A和B同時加載該腳本,那麼最後會發生什麼?這兩個交易將失敗?或者兩者都會成功(例如,如果最後一個ID是10,A將插入11,B將插入12)?
請注意,因爲我是一位PHP開發人員,因此我對MySQL的行爲更感興趣。
您必須確保您使用[鎖定讀取](http://dev.mysql.com/doc/en/innodb-locking-reads.html)在第一個位置獲取MAX() (選擇)查詢;它會阻塞,直到事務提交。但是,這是非常糟糕的設計,應該*不*用於生產系統。 – eggyal
@eggyal:謝謝,非常翔實的文章,我認爲這是一個可靠的解決方案。不幸的是評論不能被標記爲答案。 – FatDog47