2

私は現在、簡単なオークションサイトに取り組んでいます。'bids'と呼ばれる独自のMySQLテーブルに入札単価を保存しています。同じ入札の2つがまったく同時に送信されないようにするための最良の方法は何でしょうか。

提出された入札が実際に最高入札であることを確認するための私の現在の戦略は、(例として)次のことを行うことです。

$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中にテーブルをロックして、この二重入札が発生しないようにする方法はありますか?このような目的でテーブルをロックすることに関する私の主な懸念は、一度に多くの人が入札する場合のパフォーマンスの問題です。

4

1 に答える 1

0

次のように、条件付き挿入を行うことができます。

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

影響を受ける(挿入された)行を確認します。

于 2012-11-19T19:09:18.647 に答える