2017-01-12 3 views
1

У меня есть сайт с одной страницей в javascript.два одновременных соединения/запросы блокировки

Чтобы упростить все три типа запросов HTTP посылаются на сервер

/action/status/ 
/action/csv_process/ 
/action/status_pid/ 

Каждый 30 второй запрос /action/status/ отправляется на сервер. В запросе не так много. Вы можете видеть ниже все записи запросов mysql, выполненных в запросе

2017-01-12 18:37:03 2 --- REQUEST START: action status 
2017-01-12 18:37:03 2 UPDATE `log_login` SET time_active=1387 WHERE id=78360 
2017-01-12 18:37:03 2 BEGIN 
2017-01-12 18:37:03 2 COMMIT 
2017-01-12 18:37:03 2 --- REQUEST END 0.076473951339722 

Затем пользователь может загрузить CSV-файлы. Когда файлы загружаются, пользователь может выбрать способ обработки файла. Следующий запрос /action/csv_process/ часто занимает некоторое время, поэтому для получения запроса /action/status_pid/ отправляется на сервер каждые 3 секунды для получения прогресса в процентах (0-100)

Все работает нормально. В /action/status_pid/ запросы выполняются с секундными интервалами 3 и возвращает ответ, в то время как /action/csv_process/ обрабатывает, но как только /action/status/ не отправляется на сервер все, замках до /action/csv_process/ завершения

Почему /action/status/ замок все?

Каждый запрос работает с MySQL транзакций и все таблицы InnoDB

Несмотря на то, если я не использовал session_write_close() на все запросы параллельности должны просто ждать, пока текущий запрос не делается .. Но /action/status/ не в ожидании, пока запрос обработки данных выполняется и блокирует все остальные запросы с ожиданием

+1

Является ли ваш настольный движок MyISAM или InnoDB? И я не понял «ОБНОВЛЕНИЕ», за которым следуют «BEGIN» и «COMMIT». Не должно быть между началом и фиксацией? –

+0

Все таблицы InnoDB. Да, вы правы в запросах begin/commit. – clarkk

ответ

1

Если вы используете сеанс, это может блокировать один запрос, пока вы не освободите сеанс. После того, как сеанс больше не нужен, попробуйте позвонить session_write_close

+0

Я не использую 'session_write_close' в'/action/status/'.. Но он не должен полностью блокировать все. Даже запрос'/action/status/'выполняется до тех пор, пока не будет выполнен запрос процесса данных. – clarkk

+0

После отправки'/action/status/'все останавливается до завершения процесса обработки данных – clarkk

+0

@clarkk, но когда вы используете сеанс во всех этих конечных точках, пока не будет отправлен ответ только один действие за время будет выполнено. Отдых будет ждать релиза блокировки хранения сеанса –

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