您好, 我正在制作一个数据库驱动的游戏,其中有一个问题,如果用户找到正确的答案,用户有权更改问题(即写一个新问题)。
但这有一个重要的问题,我认为它被称为竞争条件。问题是:
现在,我通过使用某种信号量,通过保留timestamp
来修复此问题。总结一下,它的工作原理如下:
['user_ip' = 'x.x' , 'time'='y.y' , 'locked'='true']
因此,当提交新问题时,只有当信号量不锁定时,应用程序才接受它,并且当前时间比信号量日期大t
(15)秒
但这也存在问题,提示用户2
“你找到了答案,但有人在你面前找到了答案。你可以 如果他们在15年没有提交新问题,请更改问题 秒“。
所以新的获胜者必须等待15秒,可能是不必要的。
因此,
我想用秒表(时间计数器)提示“赢家”表格。当它达到零时,它会解锁信号量,以便新的获胜者可以提交他们的问题。
但是这个解决方案会遇到这个问题:
如果胜利者在时间计数器达到零之前关闭页面,那么AJAX请求将永远不会被完成,并且信号量将被无限期锁定。
所以如果用户关闭页面,我必须确保调用userLeave();
函数。
Google建议onbeforeunload
和onunload
,但人们也抱怨这些功能无效。如果用户(获胜者)离开页面,是否有100%的方式发送此AJAX调用?
答案 0 :(得分:2)
如果用户(获胜者)离开页面,是否有100%的方式发送此AJAX调用?
您可以 从不 依赖客户 100%做任何事情。想想网络连接丢失,浏览器崩溃,不可用的功能(从HTML5不兼容的浏览器到禁用的javascript),脚本错误,以错误方式调用(或不调用)API的错误配置代理或黑客故意这样做......
客户唯一可以期待的是他什么都不做 - 这叫做超时。
如果您希望信号量在特定时间到期,则必须创建计时器服务器端。如果你愿意,你可以另外中止计时器并在客户发出他不会提交答案时发出信号(以无论哪种方式)。如果您想尝试关闭页面,可以使用unload
事件中的同步(A)JAX。