我正在开发一个HTTP服务器,它处理来自客户端的事务请求。他们将通过高度不可靠的无线网络进行通信,因此我担心服务器数据库上数据的一致性。以下是我处理POST
请求的方式:
void doPost(request, response)
{
transaction = newTransaction();
processBody(request);
transaction.commit();
}
当我从未收到请求时,没有问题。客户端只获取timeout error
并且不执行任何事务。但是,如果响应在网络上丢失会发生什么?当然,客户仍然会收到timeout error
,但这次交易将在服务器上完成,而客户不知道!这是我需要处理的不幸情况。
所以,我的问题是:我如何检测是否已经传递了响应并以其他方式回滚事务?
我使用JavaEE编写我的服务器应用程序并将其托管在Glassfish上。
好的,我想出了这个。 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
}
}