Транзакции MySQL - ВСТАВКИ на аукционе обрабатываются в очереди? - PullRequest
0 голосов
/ 14 января 2012

В настоящее время я занимаюсь разработкой веб-сайта аукциона в рамках портфельного проекта, и я столкнулся с интересной проблемой, которая, похоже, не может быть решена.

В настоящее время я проверяю текущую самую высокую ставку (запрос 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 ]

2 голосов
/ 14 января 2012

Возможный способ - использовать select for update, который при отключении автоматической фиксации блокирует выбранную строку. На этом этапе, если ставка выше, вы вставляете новую ставку и фиксируете транзакцию, если ставка ниже, вы можете уведомить пользователя и откатить (или зафиксировать) транзакцию

1 голос
/ 14 января 2012

Лично у меня была бы вторая таблица, в которой хранятся все ставки и периодически обновляется основная ставка.Таким образом, основная ставка будет обновляться только из одного источника, и у вас никогда не будет проблем с двойной записью.

Так, например, в таблице mainBid установлена ​​основная сумма ставки.Предложения участников будут храниться в tempBid, и каждые X секунд вы получаете наибольшую ставку из tempBid для обновления mainBid

...