#http #jakarta-ee #transactions #client-server #distributed-system
#http #джакарта-ee #транзакции #клиент-сервер #распределенная система
Вопрос:
Я разрабатываю HTTP-сервер, который обрабатывает транзакционные запросы от клиентов. Они будут взаимодействовать через крайне ненадежную беспроводную сеть, поэтому я беспокоюсь о согласованности данных в базе данных сервера. Вот как я обрабатываю POST
запросы:
void doPost(request, response)
{
transaction = newTransaction();
processBody(request);
transaction.commit();
}
Когда я никогда не получаю запрос, проблем нет. Клиент просто получает, timeout error
и транзакция не выполняется. Однако, что произойдет, если ответ будет потерян в сети? Конечно, клиент все равно получит timeout error
, но на этот раз транзакция будет завершена на сервере без ведома клиента! Это неудачный случай, с которым мне нужно разобраться.
Итак, мой вопрос: как мне определить, был ли доставлен ответ, и откатить транзакцию в противном случае?
Я кодирую свое серверное приложение, используя JavaEE, и размещаю его на Glassfish.
Ответ №1:
Хорошо, я разобрался с этим. В стеке протоколов HTTP / TCP нет средств для обнаружения отбрасывания ответа. Однако он отлично обрабатывает отбрасывание запроса, так что мне нужно только отправить POST-запрос с сервера клиенту, вот так:
void doPost(request, response)
{
transaction = newTransaction();
try {
var result = processBody(request);
sendPOSTToClient(result);
transaction.commit();
catch (IOException e) {
transaction.rollback(); // network partition occured
}
}