php
  • mysql
  • transactions
  • 2012-01-13 48 views 0 likes 
    0

    我目前正在開發一個拍賣網站作爲投資組合項目的一部分,我遇到了一個似乎無法解決的有趣問題。MySQL交易 - 在隊列中處理的拍賣出價插入?

    目前我正在檢查當前最高出價(查詢1),然後如果出價高於當前存儲的出價,那麼我將新出價插入數據庫(查詢2)。公平的基本邏輯,顯然如果出價低於用戶最終將被通知。

    Query 1:  
    
    $result = mysql_query("SELECT * FROM bids WHERE item_id = '".$_POST['id']."' ORDER BY bids.amount DESC LIMIT 1"); 
    
    Query 2: 
    
        $query = sprintf("INSERT INTO bids(item_id,buyer_id,amount,created) VALUES('%s','%s','%s',NOW())", 
           mysql_real_escape_string($item_id),  
           mysql_real_escape_string($user_id),  
           mysql_real_escape_string($amount)); 
    

    注:我知道有重大的安全問題與此代碼,但是這僅僅是一個例子...

    不過,我不確定是否會有地方檢查的間隙的情況價格並插入到數據庫中,另一個查詢可能會更快,插入到數據庫中,然後破壞當前的出價邏輯。

    將使用足以確保出價正確排隊的mysqli或PDO驅動程序的交易?

    MySQL是否提供排隊mysql查詢的方法來確保這不會發生?

    回答

    2

    一種可能的方法是使用select for update,如果您禁用自動提交,請鎖定選定的行。此時,如果出價較高,則插入新出價並提交交易,如果出價較低,則可以通知用戶並回滾(或提交)交易

    +0

    也許,此刻我存儲每個投標拍賣,但我並不真的需要保留這些。鎖定行肯定是解決問題的一種方法! – 2012-01-13 23:06:45

    1

    就我個人而言,我會有第二張表存儲所有出價並定期更新主要出價。 這種方式主要的出價將永遠只能從一個來源更新,你永遠不會有雙重寫入問題。

    例如,在表mainBid中設置了主要投標金額。 人民投標將被存儲在tempBid,一旦你檢索tempBid出價最高每X秒更新mainBid

    +0

    是的,使用兩張桌子似乎是個好主意。你會用cron來更新表嗎? – 2012-01-14 21:07:00

    +0

    是的,一個cron將是最簡單的方法來做更新 – Erik 2012-01-15 00:06:56

    相關問題