首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何防止php中两个不同的ajax调用修改同一个数据库?

如何防止php中两个不同的ajax调用修改同一个数据库?
EN

Stack Overflow用户
提问于 2012-03-27 02:51:12
回答 5查看 295关注 0票数 1

我有一个javascript客户端,有时会在毫秒内向(php)服务器发送两个ajax请求。(这是一个javascript bug,我无法从客户端控制它,我只能控制服务器端)。

第一个请求检查dbase中是否已经存在凭单(给定几个参数。例如,客户id等)..如果代金券已经存在,它只是重用代金券并更新为值,如果不存在,则从头开始创建一个新的代金券。

问题是,在它完成检查凭证是否存在之前..第二个请求进入并检查凭证是否也存在。在这一点上,第一个还没有创建凭证。

长话短说..。我们最终得到了两张重复的代金券..(并且dbase不会限制凭证名称是唯一的。我也无法控制dbase )..

那么,在第一个ajax请求完成之前,我如何防止第二个ajax请求做任何事情呢?

请记住,这两个请求是两个不同的线程。因此,如果我创建任何$isVoucherCreationInProgress变量,它将是无用的,因为第二个调用将完全忽略它。

想法?

EN

回答 5

Stack Overflow用户

发布于 2012-04-02 08:38:47

如果这两个ajax请求来自同一个客户机,那么在服务器端创建一个类似锁的系统,所以如果有人检查了凭证是否存在,就设置一个会话变量,直到它完成它必须做的事情。因此,当第二行出现时,它首先检查会话,如果(其他人正在使用代金券)稍后用消息检查完成它,那么在客户端,当它收到拒绝消息时,您可以简单地发送它,并延迟1秒,以确保没有人在“工作”。

希望这能有所帮助。

或者您可以看到这个问题,以便在php中创建互斥锁:PHP mutual exclusion (mutex)

票数 2
EN

Stack Overflow用户

发布于 2012-03-27 02:58:52

就我个人而言,我会想出一个非常简单的方法。在您的服务器上,您必须有一个用于创建凭证的过程。保留一个全局数组,在创建凭证之前,将数组的索引设置为id,类似key => Value,其中key可以是凭证的id,Value可以是“创建中”这样的状态。代金券创建完成后,您可以使用代金券的id作为密钥来移除该条目。

现在,每次在创建凭证之前,只需从键的全局数组中检查是否已经存在,如果是且Value=为“creating”,则实际上您正在创建凭证,因此您将退出

希望它能有所帮助,:-)

票数 1
EN

Stack Overflow用户

发布于 2012-03-27 03:00:48

使用事务。如果你真的不能接触数据库(甚至不能写你自己的语句),你可以使用STM或类似的东西。使用锁也不会太难,但这两种方式都需要应用程序持续运行。您可以使用phpdaemon之类的软件运行服务器,并将特定路径转发到该服务器,以获得这种连续性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9877930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档