我有一个javascript客户端,有时会在毫秒内向(php)服务器发送两个ajax请求。(这是一个javascript bug,我无法从客户端控制它,我只能控制服务器端)。
第一个请求检查dbase中是否已经存在凭单(给定几个参数。例如,客户id等)..如果代金券已经存在,它只是重用代金券并更新为值,如果不存在,则从头开始创建一个新的代金券。
问题是,在它完成检查凭证是否存在之前..第二个请求进入并检查凭证是否也存在。在这一点上,第一个还没有创建凭证。
长话短说..。我们最终得到了两张重复的代金券..(并且dbase不会限制凭证名称是唯一的。我也无法控制dbase )..
那么,在第一个ajax请求完成之前,我如何防止第二个ajax请求做任何事情呢?
请记住,这两个请求是两个不同的线程。因此,如果我创建任何$isVoucherCreationInProgress变量,它将是无用的,因为第二个调用将完全忽略它。
想法?
发布于 2012-04-02 00:38:47
如果这两个ajax请求来自同一个客户机,那么在服务器端创建一个类似锁的系统,所以如果有人检查了凭证是否存在,就设置一个会话变量,直到它完成它必须做的事情。因此,当第二行出现时,它首先检查会话,如果(其他人正在使用代金券)稍后用消息检查完成它,那么在客户端,当它收到拒绝消息时,您可以简单地发送它,并延迟1秒,以确保没有人在“工作”。
希望这能有所帮助。
或者您可以看到这个问题,以便在php中创建互斥锁:PHP mutual exclusion (mutex)
发布于 2012-03-26 18:58:52
就我个人而言,我会想出一个非常简单的方法。在您的服务器上,您必须有一个用于创建凭证的过程。保留一个全局数组,在创建凭证之前,将数组的索引设置为id,类似key => Value,其中key可以是凭证的id,Value可以是“创建中”这样的状态。代金券创建完成后,您可以使用代金券的id作为密钥来移除该条目。
现在,每次在创建凭证之前,只需从键的全局数组中检查是否已经存在,如果是且Value=为“creating”,则实际上您正在创建凭证,因此您将退出
希望它能有所帮助,:-)
发布于 2012-03-26 19:00:48
使用事务。如果你真的不能接触数据库(甚至不能写你自己的语句),你可以使用STM或类似的东西。使用锁也不会太难,但这两种方式都需要应用程序持续运行。您可以使用phpdaemon之类的软件运行服务器,并将特定路径转发到该服务器,以获得这种连续性。
https://stackoverflow.com/questions/9877930
复制相似问题