#http #transactions #cancellation
#http #транзакции #отмена
Вопрос:
Для запроса с не таким уж коротким периодом, и пользователь отменил соединение (т. Е. он / она закрыл браузер до завершения запроса), что тогда произойдет на стороне сервера?
Однако это должно зависеть от сервера. Но каков был бы обычный способ?
Выполнение некоторых запросов занимает довольно много времени, например, транзакция распределенной СУБД, которая передает данные на несколько разных серверов в разных странах. (Я знаю, что это очень распространено в банковских приложениях)
Некоторые запросы отправляют клиенту большой объем данных, например, когда пользователь загружает большое вложение.
Должен ли он отменять поток запроса по истечении определенного времени ожидания?
Должно ли мое веб-приложение следить за действиями пользователя и самостоятельно отменять транзакцию следующим образом:
service(request, response):
tx_start();
do {
do_some_work()
if (user_canceled) break;
do_some_work()
if (user_canceled) break;
do_some_work()
if (user_canceled) break;
do_some_work()
if (user_canceled) break;
do_some_work()
if (user_canceled) break;
tx_commit();
return;
} while (false);
tx_rollback();
throw new CanceledException();
}
должен ли я?
Комментарии:
1. Я пришел сюда с тем же вопросом. Что делает IIS, если пользователь закрывает окно во время длительного запроса? Я ожидаю, что IIS позволит потоку завершиться, но откажется от выходных данных. В противном случае нашему коду потребовалась бы логика для обработки прерываний.
Ответ №1:
Проблема:
- Если выполнение функции do_some_work () занимает больше времени, чем ожидалось, и клиентское соединение прервано, do_some_work () может быть продолжено, когда транзакция больше не нужна.
Решения:
- Отдельная транзакционная работа сервера и ввод данных клиентом с использованием другого потока.
- Позвольте клиенту прервать do_all_work(), который затем выдает CanceledException.
сервис (запрос, ответ) { попробуйте { client_start (запрос); tx_start(); do_all_work(); tx_commit(); } catch(CanceledException ce) { tx_rollback(); выбросить ce; } наконец { client_join(); } } client_start(запрос) { клиент = новый клиент (запрос); client_thread = новый поток (client).start(); } client_join() { client_thread.join(1000); // подождите 1 секунду, пока поток клиента завершится }
Комментарии:
1. Это не отвечает на вопрос. Что обычно делают веб-серверы, такие как IIS и Tomcat, когда пользователь отменяет запрос?