我有一個應用程序,遺憾的是MyISAM表(bleagh ...)使用遺留mysql_ *函數,所以我不能使用事務。我有代碼獲得當前餘額,檢查這個餘額是否正常,如果是,它會減去一個數量並保存新餘額。MySQL SELECT返回舊值
問題是,我最近看到一個實例,其中兩個查詢獲取相同的起始餘額,減去一個數量,然後記錄新的餘額。既然他們都抓住了相同的起始餘額,那麼兩次UPDATES之後的期末餘額都是錯誤的。
100 - 10 = 90
100 - 15 = 85
當它應該是...
100 - 10 = 90
90 - 15 = 75
這些請求執行的若干分鐘的間隔,所以我不相信的差異是由於競爭條件。但我最初的想法是MySQL緩存存儲了獲取餘額的相同初始查詢的結果。然而,我讀到,如果修改了任何相關的表,這種類型的緩存就會被刪除。
我很有可能通過將所有內容放入一個查詢來解決問題,但我仍然想知道這一點。它使我感到神祕。如果緩存在修改表時被刪除,那麼發生的事情不應該發生。有沒有人聽說過這樣的事情,或有任何想法,爲什麼它可能發生?
你能發佈一個簡化版本的代碼來重現這種行爲嗎? –
你確定你不能使用'mysql_ *'進行交易嗎?我認爲這只是做'mysql_query(「START TRANSACTION」)等等,只要你使用innoDB表。 – bfavaretto
@bfavaretto不幸的是他們是MyISAM。 – dqhendricks