如果客户端取消请求,则回滚数据库更改



摘要

如果客户端在返回响应之前取消请求(关闭浏览器/选项卡、刷新页面等(,我希望回滚数据库更改。

我的案例:

我正在后台创建一个视图,这个视图是非常私人的,它是根据请求创建的,数据库中的一个实体是根据每个请求创建的。它保存用户创建这个视图和离开它的日期。

我使用WebSocketonClose来确定客户端是否关闭了他的页面,如下所示:

  1. 客户端发出HTTP请求以创建页面
  2. 客户端等待大约2秒,直到创建页面(一些数据保存在数据库中,关于创建该页面的时间、包含的内容等(
  3. 响应将返回给客户端
  4. WebSocket随后被初始化
  5. 现在,如果客户端关闭页面,WebSocketonClose将被触发,并指示用户何时离开页面

一切都很好!直到我注意到一些客户查看了页面,但从未离开过它!我进一步调查发现,他们发出了创建页面的HTTP请求,在返回响应之前,他们就发出了大量的请求,因此,页面被创建了,但WebSocket从未初始化!

我想到的解决方案是在返回响应之前检查用户是否已经完成了请求,然后数据库更改应该回滚(有更好的解决方案吗?(。

代码语言

我使用PHP(Laravel(和MySql作为数据库。

我建议等待web套接字准备好/初始化,然后通过HTTP请求请求页面并最终呈现。

但是,除了您当前的解决方案外,还可以使用onbeforeunload事件,如:

window.addEventListener('beforeunload', abort, false);
function abort(e) {
// code to abort 
socket.close();   
}

通过此事件,您可以捕捉到关闭选项卡或浏览器的情况。

最新更新