我正在为我的PHP站点编写一个新引擎,该引擎具有数据缓存功能。现在我想知道这些脚本之间是否可能发生干扰。请考虑以下示例:
假设很多用户访问与摄影相关的网站,其中两人几乎在同一时间运行两个脚本。
脚本1将名为“FooBar”的用户和他的所有照片从数据库中删除。
Script2显示一个nr 12345照片(由FooBar制作)。
$id
中。$owner
中的商店所有者ID。query("DELETE FROM users WHERE id='$id' ");
query("SELECT name FROM users WHERE id='$owner' ");
//error这里是query("DELETE FROM photos WHERE owner='$id' ");
正如我们所看到的,脚本2检测到照片存在,但它的所有者已经被移除。
问题是:是否按顺序处理脚本(因此所提供的场景是不可能的)?如果没有,在一个脚本中发送多个查询时,我能做些什么来防止这样的错误呢?
非常感谢。
谢谢你的回答。呈现的场景只是一个例子,我知道这可以用更好的方式完成。因此,在创建一个大型网站时,我必须不断地意识到,数据可以在运行时进行更改。
但是这样,我就不能信任php中存储在变量中的任何信息。你如何处理这类问题?更新或获取一个查询中的所有数据?
发布于 2011-02-06 15:19:08
提出的方案是可能的。我想说的唯一可以做的就是为这种情况编写一个错误代码:如您所示,查询4不返回有效的所有者。现在您可以做几件事情,其中就有几个例子:
发布于 2011-02-06 16:04:04
事实上,种族状况是有可能的。
我会说,在删除脚本中删除用户之前的照片,我觉得很奇怪。如果在用户删除之后,但是在删除照片之前,有什么东西掉了出来,那么db仍然有他的孤儿照片。通常,事务(使用支持事务的存储引擎,如InnoDB)可以缓解此问题。
至于竞赛条件本身,我认为有一些技术可以使用行锁定来防止其他进程同时访问它们。
如果我有机会做一些研究,我会填写更多的细节。到目前为止,我对‘'mysql行锁定’的简短研究表明,一些引擎实际上隐式地锁定了受事务影响的任何行。但我承认在那里没有直接的经验。
https://stackoverflow.com/questions/4914064
复制相似问题