Php 数据缓存会造成干扰吗?

Php 数据缓存会造成干扰吗?,php,mysql,caching,Php,Mysql,Caching,我正在为我的PHP站点编写一个新引擎,它具有数据缓存功能。现在我想知道这些脚本之间是否可能存在干扰。考虑下面的例子: 假设许多用户访问了与摄影相关的网站,其中两人几乎在同一时间运行了两个脚本 脚本1从数据库中删除名为“FooBar”的用户及其所有照片 脚本2显示照片编号12345(由FooBar制作) (脚本1)检查用户“FooBar”是否存在。将其ID存储在变量$ID中 (脚本2)检查照片编号12345是否存在。将所有者ID存储在变量$owner中 (脚本1)query(“从id='$id'的

我正在为我的PHP站点编写一个新引擎,它具有数据缓存功能。现在我想知道这些脚本之间是否可能存在干扰。考虑下面的例子:

假设许多用户访问了与摄影相关的网站,其中两人几乎在同一时间运行了两个脚本

脚本1从数据库中删除名为“FooBar”的用户及其所有照片

脚本2显示照片编号12345(由FooBar制作)

  • (脚本1)检查用户“FooBar”是否存在。将其ID存储在变量
    $ID
  • (脚本2)检查照片编号12345是否存在。将所有者ID存储在变量
    $owner
  • (脚本1)
    query(“从id='$id'的用户中删除”)
  • (脚本2)
    query(“从id=“$owner”的用户中选择名称”)//此处出错
  • (脚本1)
    query(“从照片中删除,其中所有者=“$id”)
  • 如我们所见,脚本2检测到照片存在,但其所有者已被删除

    问题是:PHP脚本是否按顺序处理(因此所呈现的场景不可能)?如果不是,在一个脚本中发送多个查询时,如何防止此类错误

    非常感谢你


    谢谢你的回答。所呈现的场景只是一个例子,我知道这可以用更好的方式来实现。所以,当创建一个大型网站时,我必须时刻意识到数据在运行时是可以更改的


    但这样,我就不能信任php中存储在变量中的任何信息。你如何处理这类问题?在一个查询中更新或获取所有数据?

    所呈现的场景是可能的。我想说的唯一一件事是为这种情况编写一个错误代码:如您所示,查询4没有返回有效的所有者。现在,您可以做几件事,以下只是示例:

    • 在组合查询中返回ownername,这样,如果找到图片的所有者,您至少可以显示名称(第2点)。如果以后你想展示更多,你只需返回所有者不再(再)展示的信息。这就是发生的情况(它在加载之间被删除),因此,即使对用户来说有点奇怪,他也必须处理它:)
    • 只需在第4点显示错误,有点像上一个示例的第二部分。你很快就得到了一个结果,但结果不见了。所以您返回“无法加载用户”之类的内容

    事实上,竞争条件是可能的

    我会说,在删除脚本中,在用户的照片之前删除用户,这让我觉得很奇怪。如果在用户删除之后但在照片删除之前出现了一些问题,那么db仍然有他的孤立照片。通常,事务(使用支持它们的存储引擎,如InnoDB)可以缓解此问题

    至于竞争条件本身,我相信有一些技术使用行锁定来防止其他进程同时访问它们

    [如果我有机会做一些研究,我会填写更多的细节。我到目前为止的简要研究表明,一些引擎实际上会隐式锁定受事务影响的任何行。但我承认我在这方面没有直接经验。]

    步骤4不应该是“错误”,您应该检测到它没有返回任何记录,并向用户显示404。