0

我有一个 API,移动应用程序使用它来创建用户配置文件。似乎有时应用程序会超时并显示错误消息,但服务器会继续创建配置文件。结果是我们有一些重复的配置文件。

我在想,作为不需要完全重新架构的“快速修复”,我可以尝试设置 PHP 脚本的执行时间以匹配应用程序中的超时限制。我的问题是,如果达到这个时间限制,我能否以某种方式执行“撤消对数据库的更改”脚本,无论是自动的还是我指定的脚本?

我知道我真的应该更多地研究为什么 PHP 会达到超时限制(这是几分钟!),但我已经在服务器上调整了一些位,并且大多数执行时间只有几毫秒。只有少数情况会发生超时。例如,我正在查看用户位于以色列的那一刻。以色列的网络连接不好吗?谁能想到任何可能导致我正在经历的行为的事情?

4

2 回答 2

1

一种方法是使用数据库事务。我在 PostgreSQL 方面有这方面的经验,但我相信 MySql 也会这样做。您会将所有内容包装在事务中。然后您可以在检测到失败时取消事务,回滚属于该事务的所有内容。

然后,您无法捕获脚本超时,因为它是一个致命错误,但是如果事务未提交,则应自动回滚(取消),因此您应该设置...

也许它对你有用?

参考:

于 2013-01-25T10:38:24.293 回答
1

假设:您正在使用带有 INNODB 的 MySQL。

您应该考虑使用transactions使用 INNODB,如果会话超时, 如果您将自动提交设置为 0 ,事务将回滚,如下所示:

SET GLOBAL init_connect='SET autocommit=0';

与PDO的交易示例:

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries ; of 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();

} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}
于 2013-01-25T10:40:18.237 回答