Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP在MySQL中删除和插入之间可能存在问题?_Php_Mysql_Race Condition - Fatal编程技术网

使用PHP在MySQL中删除和插入之间可能存在问题?

使用PHP在MySQL中删除和插入之间可能存在问题?,php,mysql,race-condition,Php,Mysql,Race Condition,我不完全确定这是否可行,因此希望澄清是否可行,如果可行,前进的方向是什么(防止或如果不可能缓解) 我有一个PHP脚本,允许用户提交数据(插入),另一个PHP脚本(不同的文件),允许删除所述数据(从中删除),现在让我们假设我正在删除内容,碰巧有人同时提交了一些内容-这会导致数据被忽略吗(留在那张桌子上) 我已经搜索并遇到了与比赛条件相关的东西-不确定这是否就是上述问题的分类 如果它有助于将上述内容放到上下文中,那么用户就可以提交对某个主题的回复(帖子)(在论坛帖子中插入topic_id=?),我也

我不完全确定这是否可行,因此希望澄清是否可行,如果可行,前进的方向是什么(防止或如果不可能缓解)

我有一个PHP脚本,允许用户提交数据(插入),另一个PHP脚本(不同的文件),允许删除所述数据(从中删除),现在让我们假设我正在删除内容,碰巧有人同时提交了一些内容-这会导致数据被忽略吗(留在那张桌子上)

我已经搜索并遇到了与比赛条件相关的东西-不确定这是否就是上述问题的分类

如果它有助于将上述内容放到上下文中,那么用户就可以提交对某个主题的回复(帖子)(在论坛帖子中插入topic_id=?),我也可以删除该主题(希望可以删除所有附加的帖子)也就是说,从论坛主题中删除,其中主题id=?然后从论坛帖子中删除,其中主题id=?如果在执行删除操作时,用户能够以某种方式发布对主题的回复,那么这可能会导致问题(因为我们有一篇没有主题的帖子!)


希望这是有意义的。

这正是进行交易的目的。 例如(伪代码)


当您执行
commit
时,所有3个事务都是在没有延迟的情况下同时完成的,并且不会被其他用户删除某些内容而中断

是的,您可以在此处设置竞争条件-您的行存在性测试恰好发生在一个进程中的测试和另一个进程中的操作之间。您可以将表锁定为preven为了防止这种情况发生,通常使用外键约束来防止数据库损坏。或者可以使用一种称为信号量的标记(存储在任何地方,即数据库中)它控制并应该防止竞态条件。请参阅。@Kleskowy谢谢您,不要假设您有任何示例代码让我开始,wikipedia链接涵盖了该主题,但没有介绍如何将其引入PHP/MySQL?在INSERT INTO查询中添加一个IF以检查论坛主题中是否存在主题id,请解决该问题问题?谢谢@Oleg,我知道你不知道我的项目的来龙去脉,但我已经添加了额外的信息,将我的问题置于上下文中(见上文)-您认为在PHP脚本上删除事务或在PHP脚本上插入事务更合适吗?或者两者都合适吗?我们肯定会对此做更多的研究!这不会起作用,因为执行所有查询的不是单个调用。如果我理解正确,OP讨论的是用户a插入和用户B de的情况同时删除。@giorgio这正是我要问的!请解释。比如说,一条记录不存在。如果一个用户删除了旧记录,而另一个用户添加了一条新记录,该怎么办?有什么问题吗?请解释您的错误concern@OlegDubas我进一步更新了我的问题(见上文),以详细说明:
$db->beginTransaction();

// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');

// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();