Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Частые запросы к скрипту 
V
    Опции темы
AJIeKceuD
Дата 26.11.2013, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Возникла проблема при работе скрипта. Когда к нему приходят слишком частые обращения, то проверки реализованные внутри начинают врать. 
В частности баланс пользователя запрашиваемый в начале и (в случае успешного выполнения скрипта) обновляемый в конце, в случае двух одновременных запросов может обоим вернуть некий начальный баланс, а потом они оба его уменьшат и вгонят в минус.
Можно как-то заставить их выполниться последовательно, например заставить второго "повисеть" пока не отработает первый?
PM MAIL   Вверх
ksnk
Дата 26.11.2013, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Вначале можно лочить файл, а в конце скрипта - разлочивать его
http://us3.php.net/manual/en/function.flock.php


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AJIeKceuD
Дата 26.11.2013, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Какой файл? Есть только файл с пхп скриптом, который запрашивает баланс, сравнивает его с присланным значением и если все хорошо отправляет разные запросы в базу, а потом меняет баланс (сам баланс лежит в Редисе). И когда два запроса приходят одновременно, то они запрашивают баланс до того как тот будет изменен кем либо из них. И следовательно оба проходят проверку, хотя должен был бы только один.
PM MAIL   Вверх
ksnk
Дата 26.11.2013, 20:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Цитата(AJIeKceuD @  26.11.2013,  19:42 Найти цитируемый пост)
Какой файл?

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AJIeKceuD
Дата 28.11.2013, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



ksnk, Спасибо, похоже это наиболее оптимальное для моих условий решение.
PM MAIL   Вверх
Fortop
Дата 28.11.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(AJIeKceuD @  26.11.2013,  19:14 Найти цитируемый пост)
Можно как-то заставить их выполниться последовательно, например заставить второго "повисеть" пока не отработает первый? 


Цитата(AJIeKceuD @  26.11.2013,  19:42 Найти цитируемый пост)
 (сам баланс лежит в Редисе)


А транзакции?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
AJIeKceuD
Дата 11.12.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



Цитата(Fortop @ 28.11.2013,  14:05)
А транзакции?

Не очень понял что имеется ввиду. Приходят два раздельных запроса, каждый начинает обработку данных. В частности оба запрашивают баланс, проверяют его и меняют. Как два разных запроса объединить в одну транзакцию? И как транзакция поможет мне с запросом баланса и его проверкой?
PM MAIL   Вверх
ksnk
Дата 11.12.2013, 17:48 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



AJIeKceuD, Транзакция - это специального вида запросы в базу. Ничего особенного, но можно выполнять сложные и не очень тривиальные вычисления, и появляется возможность сказать "ааааа - ничего не получилось!" и все измененные таблицы отъедут к состоянию на начало транзакции. Очень удобно. smile 

Начало транзакции, фактически, лочит таблицы от изменения. Примерно то же, что и лок файла, только файла заводить не нужно. Конкурентный процесс будет висеть на операции begin transaction, пока работающий процесс не прервет или не подтвердит транзакцию.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AJIeKceuD
Дата 11.12.2013, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 6.9.2012

Репутация: нет
Всего: нет



ksnk, лочит от изменений, но это не остановит запрос значения (а значит они пройдут проверку). К тому же у меня все-таки Редис, а не мускул. Там тоже есть транзакции, но опять же, проблема не в том что оба запроса пишут, а в том что оба читают раньше чем кто-либо из них пишет.

Вообще почитав еще раз про локи я думаю они могли бы помочь, если бы это был MySQL, а не Редис...

Это сообщение отредактировал(а) AJIeKceuD - 11.12.2013, 20:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.