![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| AJIeKceuD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.9.2012 Репутация: нет Всего: нет |
Возникла проблема при работе скрипта. Когда к нему приходят слишком частые обращения, то проверки реализованные внутри начинают врать.
В частности баланс пользователя запрашиваемый в начале и (в случае успешного выполнения скрипта) обновляемый в конце, в случае двух одновременных запросов может обоим вернуть некий начальный баланс, а потом они оба его уменьшат и вгонят в минус. Можно как-то заставить их выполниться последовательно, например заставить второго "повисеть" пока не отработает первый? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Вначале можно лочить файл, а в конце скрипта - разлочивать его
http://us3.php.net/manual/en/function.flock.php -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| AJIeKceuD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.9.2012 Репутация: нет Всего: нет |
Какой файл? Есть только файл с пхп скриптом, который запрашивает баланс, сравнивает его с присланным значением и если все хорошо отправляет разные запросы в базу, а потом меняет баланс (сам баланс лежит в Редисе). И когда два запроса приходят одновременно, то они запрашивают баланс до того как тот будет изменен кем либо из них. И следовательно оба проходят проверку, хотя должен был бы только один.
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Любой. Создай его на сервере, специально для того, чтобы лочить. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| AJIeKceuD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.9.2012 Репутация: нет Всего: нет |
ksnk, Спасибо, похоже это наиболее оптимальное для моих условий решение.
|
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
А транзакции? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| AJIeKceuD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.9.2012 Репутация: нет Всего: нет |
Не очень понял что имеется ввиду. Приходят два раздельных запроса, каждый начинает обработку данных. В частности оба запрашивают баланс, проверяют его и меняют. Как два разных запроса объединить в одну транзакцию? И как транзакция поможет мне с запросом баланса и его проверкой? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
AJIeKceuD, Транзакция - это специального вида запросы в базу. Ничего особенного, но можно выполнять сложные и не очень тривиальные вычисления, и появляется возможность сказать "ааааа - ничего не получилось!" и все измененные таблицы отъедут к состоянию на начало транзакции. Очень удобно.
Начало транзакции, фактически, лочит таблицы от изменения. Примерно то же, что и лок файла, только файла заводить не нужно. Конкурентный процесс будет висеть на операции begin transaction, пока работающий процесс не прервет или не подтвердит транзакцию. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| AJIeKceuD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 6.9.2012 Репутация: нет Всего: нет |
ksnk, лочит от изменений, но это не остановит запрос значения (а значит они пройдут проверку). К тому же у меня все-таки Редис, а не мускул. Там тоже есть транзакции, но опять же, проблема не в том что оба запроса пишут, а в том что оба читают раньше чем кто-либо из них пишет.
Вообще почитав еще раз про локи я думаю они могли бы помочь, если бы это был MySQL, а не Редис... Это сообщение отредактировал(а) AJIeKceuD - 11.12.2013, 20:14 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |