我有一个 javascript 客户端,它有时会在几毫秒内向 (php) 服务器发送两个 ajax 请求。 (这是我无法从客户端控制的 javascript 错误,我只能控制服务器端)。
第一个请求检查凭证是否已经存在于数据库中(给定几个参数..即客户ID等)..如果凭证已经存在,它只是重新使用凭证并更新值,如果它不会,它会从头开始创建一个新的。
问题是在它完成检查凭证是否存在之前..第二个请求进入并检查凭证是否也存在..此时第一个请求还没有创建凭证..
长话短说..我们最终得到了 2 个重复的凭证..(并且数据库不限制凭证名称是唯一的。我也无法控制数据库)..
那么如何防止第二个 ajax 请求在第一个请求完成之前执行任何操作?
请记住,这两个请求是两个不同的线程。因此,如果我创建任何 $isVoucherCreationInProgress 变量,它将毫无用处,因为第二次调用将完全忽略它。
想法?
最佳答案
如果 2 个 ajax 请求来自同一个客户端,则在服务器端创建一个类似锁的系统,因此如果有人检查了凭证是否存在,则设置一个 session 变量,直到它完成它必须做的事情。因此,当第二行出现时,它首先检查 session ,如果(其他人正在使用凭证)稍后通过消息检查完成它,所以在客户端,当它带有被拒绝的消息时,您可以简单地用 1 发送它第二次延迟,以确保没有人在“工作”。
希望这对您有所帮助。
或者您可以看到这个问题以便在 php 中创建互斥体:PHP mutual exclusion (mutex)
关于php - 如何防止php中的两个单独的ajax调用修改同一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877930/