2017-10-04 52 views
0

我有拍賣的一個表,其中多個用戶投標拍賣處理在數據庫中同一時間多個條目使用PHP

ID | BidderID | AuctionID | HighestBidPrice 
------------------------------------------------ 
1 | 1  | 35  | 100 
2 | 2  | 35  | 200 
3 | 3  | 35  | 200 
4 | 2  | 35  | 300 
5 | 3  | 35  | 300 

當用戶使在同一時間兩個投標出價成爲插入表。我正在嘗試編寫代碼來處理特定AuctionID的這種類型的死鎖條件。甚至不應該有用戶能夠插入更低的價格,然後最後HighestBidPrice。

我檢查車況表的查詢關鍵詞,比如

$last_bid = $this->db->query("select * from Auction as A where A.AuctionID = 35 order by ID desc limit 1")->result_array(); 

首先我得到的最後一個最高競標價,然後檢查

if($last_bid){ 
     if(isset($last_bid[0]['HighestBidPrice']) && $last_bid[0]['HighestBidPrice']!=""){ 
      if($last_bid[0]['HighestBidPrice'] === $_POST['HighestBidPrice']){ 
       echo "The Bid with this price already made."; 
      } 
      if($last_bid[0]['HighestBidPrice'] >= $_POST['HighestBidPrice']){ 
       echo "The Bid price is less then Highest Bid Price."; 
      } 
     } 
    } 

甚至比如果多個用戶同時放插入一個投標雙方都能夠出價。

交易能夠解決這個問題嗎?

+1

我認爲代替'transaction',你必須在插入時鎖定和解鎖表格。請參閱:http://www.mysqltutorial.org/mysql-table-locking/ –

+0

如果我鎖定表格,那麼用戶同時進行的其他出價的結果會是什麼? –

+1

在這種情況下,第二個或隨後的請求將等到第一個請求完成並解鎖表。 –

回答

0

您可以通過以下方式做到這一點:

insert into auction (BidderID, AuctionID, HighestBidPrice) 
select 10, 20, 500 
where (SELECT max(HighestBidPrice) FROM auction WHERE AuctionID = 20) < 500; 

這將插入一個新的拍賣只有當最高出價率特定auctionID小於500;

+0

這段代碼插入了出價,但是當多個用戶同時出價時插入了這兩個出價。插入相同的HighestBidPrice。 –

+1

您是如何創建同時競標的情況進行測試的? –

+0

我有一個按鈕可以對錶單進行出價。當2個用戶同時點擊他時,按鈕BidIncrementPrice成爲HighestBidPrice的新增價格,新價格成爲用戶的下一個出價。 –

相關問題