2015-09-28 75 views
0

我正在運行一個短信發送網站。當用戶發送消息時,需要從他們的賬戶中扣除1個信用點。更新Mysql多個請求在1秒

但是,當用戶快速提交請求時,帳戶不會正確遞減。例如,用戶以10學分開始,快速提交3個請求,但數據庫將餘額存儲爲9個學分而不是7個!

下面是如何更新數據庫:

$sql5="update sms set sms='$remaining_sms' WHERE username='$session_username'"; 
$result5=mysql_query($sql5); 

回答

0

你已經有了幾次要求都爭着把自己的想法是正確的值到數據庫中。因此,兩個請求同時到達,他們都將信用級別讀爲「10」,發送消息,然後都寫入「9」作爲新的信用級別。

相反,應該讓數據庫減量爲您

$sql5="update sms set sms=sms-1 WHERE username='$session_username'"; 
$result5=mysqli_query($link, $sql5); 

這將保持正確的信用級別,但在重負載下,這可能會爲負,因此用戶可以發送一些更多的信息比他們的信用對於!

爲了防範這種情況,您需要一個查詢,它既可以減少賬戶,也可以查詢是否有任何信用。事情如此簡單會做的伎倆:

UPDATE sms SET sms=sms-1 WHERE sms>0 AND username=? 

然後檢查連續使用mysqli_affected_rows或類似的技術更新 - 如果沒有行被更新,那麼他們的話費不足。如果是,那麼他們有信貸,並已被成功扣除。

有關避免這些各種各樣的比賽條件更加技術,see this question

最後,請注意,using the mysql_ PHP functions is deprecated