2015-08-02 4 views
3

Я не совсем уверен, как это сказать, однако мой пример должен помочь. Я столкнулся со следующей проблемой:Несколько запросов к одному набору данных

Есть 3 участников торгов в аукционе:

  • Первые торги $ 1, а их счета вычитается из этой суммы.
  • Второй участник торгов предлагает $ 2, поэтому первая ставка возвращается, а баланс второго вычитается.
  • Однако сценарий, возвращающий первого участника торгов, еще не завершен, а третий участник торгов отправляет запрос на торгах 3 доллара.
  • Поскольку сценарий еще не закончен, он по-прежнему выбирает первого участника торгов самым высоким, поэтому начинает возвращать их снова.

После того как все эти сценарии закончили выполнение, 1 претендент получает возвращается дважды и претендент 2 в ставку только исчезла.

Я использую mysql для хранения информации о ставках и php для выполнения запросов.

Я слышал, что Database Transactions может помочь, но я не совсем уверен, как.

+1

Почему любые деньги будут перемещены по * предложению *? это должно произойти только в конце. –

+0

Наш сайт не использует деньги, он использует своего рода виртуальную валюту. Это сложно, но имеет денежную ценность в долгосрочной перспективе - вычет немедленно предотвращает злоупотребление нашими системами. –

+0

Это не то, как любой аукцион должен работать –

ответ

3

Ваш второй скрипт состоит из двух взаимодействий с базой данных. По умолчанию каждый оператор БД выполняется как одна транзакция. В вашем случае вам необходимо выполнить оба взаимодействия второго скрипта как одну транзакцию. Это предотвращает запуск третьего сценария (который также должен выполняться как одна транзакция), начиная с завершения второго скрипта. См. PHP + MySQL transactions examples для примера о выполнении транзакций с несколькими операторами с php и mysql.

+0

Выполняют ли транзакции какие-либо другие данные, которые записываются в базу данных во время выполнения? Или это похоже на git, где куча только что совершена сразу? –

+0

Это зависит от используемой вами системы. Каждый раз, когда транзакция запускается, некоторые объекты базы данных блокируются (это могут быть отдельные кортежи или целая таблица - в зависимости от того, как реализована мелкозернистая блокировка). Если объекты заблокированы для записи, никакая другая транзакция не может читать или писать один и тот же объект. Если транзакция совершает или прерывается, блокировки освобождаются. В случае фиксации все изменения доступны для другой транзакции одновременно. I случай прерывания, восстанавливается старое/неизмененное состояние БД. Таким образом, работа на другом объекте может выполняться параллельно/одновременно. –

+0

Хорошо, спасибо, похоже, это то, что я ищу - я использую mysql, скажем, в соответствии с вашим примером. Я начинаю транзакцию. До тех пор, пока это не будет завершено или не откат, могут ли любые данные быть записаны в таблицу? Или я могу указать определенные строки (строки), которые нужно заблокировать, и разрешить изменение остальных? –

Смежные вопросы