2012-01-13 2 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

를 업데이트하지만 난 정말이 유지 할 필요가 없습니다. 행을 잠그면 확실히 문제를 해결할 수 있습니다. –

1

개인적으로 두 번째 표 모든 입찰가를 저장하고 주기적으로 기본 입찰가를 업데이트합니다. 이렇게하면 기본 입찰가가 단일 소스에서만 업데이트되고 이중 쓰기 문제는 발생하지 않습니다.

예를 들어, 표 mainBid에는 기본 입찰 금액이 설정됩니다. 사람들의 입찰 tempBid에 저장됩니다 한 번 당신이 tempBid에서 가장 높은 입찰을 검색 할 때마다 X 초는 순간에 나는 경매에 대한 모든 입찰를 저장하고, 아마도 mainBid

+0

두 테이블을 사용하는 것이 좋습니다. cron을 사용하여 테이블을 업데이트 하시겠습니까? –

+0

예, cron은 업데이트를 수행하는 가장 간단한 방법입니다. – Erik

관련 문제