0

2つのテーブルを使用してphpmySQL(MyISAM)とPDOを使用して、制限または最大入札シナリオでオークションシステムを開発しています

競売

 Id   | title | seller  |  currentbid   |  limit(max bid)   |  dated | bidder

入札

 Id  | auctionid | bid  | bidder | dated

ユーザーが入札した後、次のことが起こります(私はPDOプリペアドステートメントを使用しています)

 $record = fetch (‘Select * from auction where id = :id’, array(‘id’ => $id))
 $increment = 1;
 $postedBid = $_REQUEST[‘postedBid’];
 $currentBid = $record[‘currentbid’];
 $limitBid = $record[‘limit’];

 If($postedBid < $currentBid + $increment){
    Return;(without processing bid!)
 }else{
    If($limitBid !> $postedBid){
       Insert into bids (auctionid, bid, bidder, dated(timestamp)) values ($auctioned, $postedBid, ……);

       Update auction set currentbid = $postedBid, limit = $postedBid ….

       }else{

       Insert into bids (auctionid, bid, bidder, dated(timestamp)) values ($auctioned, $postedBid, ……);

       Insert into bids (auctionid, bid, bidder, dated(timestamp)) values ($auctioned, $postedBid + $increment, ……);

       Update auction set currentbid = $postedBid + increment, limit = $limitBid ….
      }
  }

2つのことを知りたい

1-このアプローチに問題がない場合、どうすればこれを改善できますか

2-どうすれば同時入札を回避できますか。PDOを使用してロックを適用する方法がわかりません。この問題に対処するために、ロックまたはその他のアプローチを使用したクエリの例を評価してください

ありがとう

(混合タイプのコードを使用してお詫びします)

4

1 に答える 1

0

成功/失敗のメッセージを返すだけのMySQLのストアドプロシージャでこれを行う必要があると思います。

コードを次のように変更する必要があります。

If($postedBid < $currentBid + $increment){
   Return;(without processing bid!)
} else {
   $stmt = $db->prepare("CALL update_bid(?,?, ...)");
   $stmt->execute(array($parameter1, $parameter2, ...));
}

不要なdb呼び出しを防ぐために、コードもチェックインしてください。ストアドプロシージャは、同時実行の問題がないことを確認するのに役立ちます。

于 2013-03-11T07:52:05.190 に答える