2012-11-19 66 views
2

我目前正在一個簡單的拍賣網站上工作。我將出價存儲在他們自己的稱爲'出價'的MySQL表格中。我想知道確保兩個相同的出價沒有在同一時間提交的最佳方式是什麼。向MySQL表添加拍賣出價

我驗證所提交的投標實際上是出價最高的目前的策略是做到以下幾點(爲例):

$sql = "SELECT * FROM bids WHERE amount >= '".$bidamount."'"; 
$result = mysql_query($sql); 
if(mysql_num_rows($result) == 0) { 
    $sql = "INSERT INTO bids SET amount = '".$bidamount."'"; 
    mysql_query($sql); 
    $bidid = mysql_insert_id(); 
} 

上述設定的查詢的問題是時間之間SELECT查詢運行並且INSERT查詢運行,另一個用戶可以插入相同的出價。

是否有某種方法在SELECT期間鎖定表格,以防止發生這種雙重出價?如果您有很多人一次出價,那麼鎖定表格的主要擔憂就是性能問題。

+0

你有'when'字段嗎?如果您在那裏存儲毫秒,您可以基於該查詢來查詢,以驗證執行時間是最高的。不幸的是,MySQL不支持日期時間毫秒,所以你必須以另一種方式存儲它。 –

+0

我對MySQL的內部工作原理完全天真,但是當插入發生時MySQL不應該照顧鎖定表?這是假設其他人閱讀這個線程OP順便說一句,顯然我和你都不知道答案。 – thatidiotguy

+0

如何在數量上添加一個唯一的鍵?您沒有提及是否區分商品/批次或投標表是否僅適用於單一拍賣。如果包含'item'或'lot'。 – ethrbunny

回答

1

您可能希望有條件的插入,如:

$amount = intval($amount); 
$query = " 
    INSERT INTO 
     bids(amount) 
    SELECT 
     {$amount} 
    FROM 
     (SELECT 1) tmp_tbl 
    WHERE NOT EXISTS(
     SELECT * FROM bids WHERE amount >= {$amount} 
    ) 
"; 

,並檢查受影響(插入)行。

+0

正是我需要的。謝謝! –

+0

我對它進行了一些修改,因爲'bids'爲空時它會失敗,所以引入了具有1行的臨時表。 –