2017-08-24 56 views
0

我試圖更新使用IN操作符的表兩列關於運營商的困惑

mysql_query("UPDATE table SET value = value + 1 WHERE column IN ('row1' , 'row2')"); 

,但我注意到,在ROW1 & 2行的值不正確更新,因爲我原以爲。我試着在localhost中使用相同的代碼,但它在測試服務器上工作,每小時約有15-20次點擊它不起作用。我甚至阻止了測試服務器的總流量,並且如果服務器滯後但是沒有幫助,則等待超過12小時。

我改變了我的代碼

mysql_query("UPDATE table SET value = value + 1 WHERE column = 'row1'"); 
mysql_query("UPDATE table SET value = value + 1 WHERE column = 'row2'"); 

現在我開始甚至略有增加流量,每小時約25-30次點擊的實時值。

我是否在代碼中犯了一些錯誤,從here獲得幫助,或者IN運算符是否有任何限制或者它是測試服務器的錯誤?

編輯:我正在使用免費主機。

+0

'row1'和'row2'是您的值,您要更新? –

+0

你能分享你的觀察嗎?由於您正在增加列值,您是否使用MySQL內部事務或代碼中的事務範圍進行互斥?當你說,它在localhost中工作,你是指向相同的MySQL服務器還是不同的? –

+0

@chiragsatapara不,'row1'和'row2'是列中的兩個參數,在'Animals'列中的兩個單獨的行中說'Cat'和'Dog',並讓值爲'count'。 喜歡的東西, _mysql_query( 「UPDATE SET表計數=計數+ 1 WHERE IN( '貓', '狗')列」); _ – NewBee

回答

1

我想這是經典的種族和使用沒有同步技術來創建互斥塊的情況。嘗試在事務中執行此更新語句

+0

我在電子書中讀到「TRANSACTION」功能需要更多資源,所以我避免了這一點。 但是,如果它進入「ROLLBACK」狀態,則不會記錄任何內容,我將無法跟蹤丟失的數據。 我完全不熟悉這個&這是我的第一個網站,所以很抱歉我的新手回覆。 – NewBee

+1

@NewBee Transactions提供全部或全部「工作單元」方法,這對於在單個請求/會話中寫入多個表(如處理客戶訂單)非常重要。如果事務中的查詢失敗,防止不希望的寫入。查詢失敗時發生回滾。允許您在應用程序級別處理失敗,並能夠回滾到給定的'SAVEPOINT'。 – fyrye

+0

@SunilSinghal @fyrye感謝您對「TRANSACTION」的建議。在我目前的用法中,滯後不會影響用戶帳戶或網站內的任何內容,但在其他情況下,可能會造成嚴重破壞。我會嘗試修改所有'IN'和單獨更新的表到'TRANSACTION'。 :) – NewBee