2012-01-13 15 views
0

私は現在、ポートフォリオプロジェクトの一環としてオークションのウェブサイトを開発しており、解決できないような面白い問題を抱えています。MySQLトランザクション - オークション入札INSERTがキュー内で処理されましたか?

現時点で現在現在の最高入札価格(クエリ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

を更新するtempBidから落札金額を取得します。行をロックすることは、間違いなく問題を解決する一つの方法です! –

1

個人的には、すべての入札を保管し、定期的にメイン入札を更新します。 この方法では、メインの入札単価は1つのソースからのみ更新され、二重書き込み問題は発生しません。

たとえば、表mainBidには、入札額が設定されています。現時点では私はオークションごとに入札を格納していますが、私は実際にこれらを維持する必要はありません、 人民入札はtempBidに格納されると、一度X秒ごとに、あなたはおそらくmainBid

+0

ええ、2つのテーブルを使うのはいい考えです。あなたはcronを使ってテーブルを更新しますか? –

+0

はい、cronは更新を行う最も簡単な方法です – Erik

関連する問題