Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как правильно запускать функцию?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
gheka пишет:
Имеет ли значение когда запускается функция или нет?
Функции и всё прочее должно быть объявлено до своего использования.
Но PHP в порядке какого-то бреда позволяет делать то, что написано у вас.
Этот код имеет средства контроля параллельного запуска? Иначе говоря, concurrency всегда 1? Почему это не отдано тому, кто написан жить с параллельной работой - СУБД?
gheka пишет:
а запустится она может только если состояние счёта равняется 0 STATE=0
... на момент выполнения 3 строки.
----- PostgreSQL DBA
dcc0
Отправлено: 24 Апреля, 2015 - 20:51:35
Участник
Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
gheka пишет:
Нет наверно если честно я первый раз слышу об этом, можно где то почитать про это?
В общем случае - предусмотрен ли какой-либо механизм, чтобы этот select мог быть вызван только 1 раз и пока не завершится этот цикл ни один другой поток этот селект обрабатывать не мог?
Читать для СУБД - ACID, транзакции.
Для последующего апдейта лучше хватать сразу эксклюзивную блокировку.
begin;
select /**/ for update;
для каждой строки результата вызываете test
commit;
И rollback если что-то пошло не так вместо commit'а.
----- PostgreSQL DBA
gheka
Отправлено: 24 Апреля, 2015 - 23:28:47
Частый гость
Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011
Помог: 2 раз(а)
Мелкий пишет:
В общем случае - предусмотрен ли какой-либо механизм, чтобы этот select мог быть вызван только 1 раз и пока не завершится этот цикл ни один другой поток этот селект обрабатывать не мог?
Не пинайте сильно, нет я не думал что такое может быть
Мелкий пишет:
Читать для СУБД - ACID, транзакции.
Для последующего апдейта лучше хватать сразу эксклюзивную блокировку.
begin;
select /**/ for update;
для каждой строки результата вызываете test
commit;
И rollback если что-то пошло не так вместо commit'а.
Я нашёл что обозначают, и для чего применяются но как именно использовать в запросе это я не нашёл.
COMMIT - успешно завершить транзакцию ROLLBACK - откатить транзакцию, т.е. вернуть БД в состояние, в котором она находилась на момент начала транзакции.
Напишите пожалуйста как использовать их в запросах. Примеры.
И ПРИМЕР как сделать блокировку чтобы этот SELECT мог быть вызван только 1 раз и пока не завершится этот цикл ни один другой поток этот селект обрабатывать не мог.
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Мелкий пишет:
Функции и всё прочее должно быть объявлено до своего использования
А вот не совсем так.
Если рассматривать один файл (или несколько "соединенных" в один через requre/include), то нет никакой разницы где мы объявим функции или даже классы с методами.
Происходит примерно так:
1) Чтение файла
2) Парсинг файла
3) Перегонка в опкод
4) Выполнение
Так вот на момент 4-го пункта уже известна область памяти где лежит та или иная функция.
И она просто вызывается.
А вот к порядку объявления переменных порядок важен.
Ибо это уже рантайм (4 пункт).
Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011
Помог: 2 раз(а)
Спасибо я уже понял что обозначение функции и её запуск не имеет значения в PHP можно запускать функцию как до обозначения её так и после.
Суть моей проблемы как я сейчас понял именно в том что, у меня подобная функция которую я написал в примере в первом сообщении, запускалась из главного файла который прикреплён ко всем фалам моего скрипта. Так как мне необходимо, что бы данная функция запускалась постоянно с заходом нового посетителя на сайт, так как этой функцией обновлялись счета пользователей.
И происходило следующее если в какую ту миллисекунду заходят на сайт 2 посетителя, то функция SELECT на запуск функции срабатывает 2 раза.
И первый цикл не успевает закончится как начинается второй и получается что в базе данных в таблице INVOICES c поле STATE ещё не поменялось на 2 поэтому и получается, что SELECT иногда пропускает 2 раза ID с одним и тем же значением.
По этому я сейчас переделал запуск этой функции в CRON с запуском каждую минуту, там ей и место, почему сразу так не сделал не знаю.
Но у меня есть подобная функция это бронирования товара для покупателя, принцип тот же если одновременно 2 покупателя нажмут кнопку перейти к оплате то проверка на остаток товара может не сработать и получится что 2 покупателя забронируют больше товара чем есть в наличии. По этому без блокировки SELECT тут не обойтись.
Поэтому прошу выложите примеры как блокировать SELECT? на примере процедурного стиля так как я пишу скрипт на нём.
Заранее спасибо.
DeepVarvar
Отправлено: 25 Апреля, 2015 - 09:07:13
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
1 Как правильно на 1 примере или на 2? 2 Я где то читал что транзакции работают только на таблицах InnoDB правда ли это или на MyISAM тоже работает?
Мелкий
Отправлено: 25 Апреля, 2015 - 10:38:55
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
gheka пишет:
1 Как правильно на 1 примере или на 2?
Правильно - выкинуть к чертям mysql_* и использовать pdo, у которого реализовано нормальное API по работе с транзакциями.
Ну или хотя бы mysqli. Не столь удобен, но тоже неплох.
gheka пишет:
2 Я где то читал что транзакции работают только на таблицах InnoDB правда ли это или на MyISAM тоже работает?
Только innoDB.
Хранить данные можно только в транзакционном хранилище - это только innoDB и его наследники (XtraDB, и не помню как в mariadb обозвали). Нет транзакционности - нет данных. (Добавление)
DeepVarvar пишет:
А вот не совсем так.
То что это работает, не означает, что так можно делать.
----- PostgreSQL DBA
gheka
Отправлено: 25 Апреля, 2015 - 10:50:54
Частый гость
Покинул форум
Сообщений всего: 191
Дата рег-ции: Февр. 2011
Помог: 2 раз(а)
Мелкий пишет:
Ну или хотя бы mysqli. Не столь удобен, но тоже неплох.
Но если вы внимательно смотрели примеры то у меня и написано с использованием mysqli
Мелкий пишет:
Только innoDB.
Значит мне это всё не подходи у меня MyISAM
А переделывать это целая история, так как у меня скрипт в 200-300 файлов
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.