php - PDO 是否有可能返回带有静态/单例共享数据库对象的 "wrong"最后插入的 ID?

标签 php mysql pdo singleton

对于 MySQL/PDO,我相信 PDO::lastInsertID() 返回连接的最后插入对象的 ID。我的 PDO 对象包含在一个单例对象中,任何方法都可以调用该对象,因此对服务器的每个 HTTP 请求只有一个数据库连接。

class Database {
    public $db;
    private static $dsn;
    private static $instance;

    private function __construct()
    {
        $this->db = new PDO( self::$dsn );
    }

    public function __destruct()
    {
        $this->db = null;
    }

    public static function getInstance()
    {
        if ( !isset( self::$instance ) ) {
            $object = __CLASS__;
            self::$instance = new $object;
        }

        return self::$instance;
    }
}

$database = Database::getInstance();
$handle = $database->db->prepare(); // etc etc etc

如果我错了请纠正我,但我相信对 Apache 的每个 HTTP 请求都会产生一个单独的 PHP 实例,所以我认为单例不会在这些 PHP 实例之间共享,而且由于代码中没有并发性,我认为它应该线性发生。所以我认为这种情况不会发生:

  1. 方法 A 使用查询 A 插入一行
  2. 方法 B 使用查询 B 插入一行
  3. 方法 A 要求最后插入的 ID 期望查询 A 的结果,而不是查询 B 的结果
  4. 方法 B 要求最后插入的 ID 期待并获得查询 B 的结果

已阅读这些,未找到答案:

PDO Last Insert ID always the right one? http://php.net/manual/en/pdo.lastinsertid.php

最佳答案

如果您确实像您的示例中那样在单个脚本中检查了您的代码 - 在运行查询 B 后获取查询 A 的插入 ID - 肯定会出现不一致。

只需在插入后的下一行获取您的插入 ID,您将不会遇到任何问题。

HTTP 和单例在这里没有任何关系。

对于此类恐惧症,有一条经验法则:考虑您的情况是否独特。对于不一致的自动增量,请考虑以下前提:

  • 这种不一致肯定会是一场灾难
  • 单例是一种流行的模式
  • HTTP 也是一种非常流行的协议(protocol)
  • 您不是唯一使用这些技术的程序员

然后你可以得出结论:只要你找不到任何关于此类灾难的证据 - 很可能它从未存在过。

此致,上校。常识。

关于php - PDO 是否有可能返回带有静态/单例共享数据库对象的 "wrong"最后插入的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19721282/

相关文章:

mysql - 如何将大型 (14 GB) MySQL 转储文件导入新的 MySQL 数据库?

MySQL/MariaDB 列值在不同列中唯一

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - 使用用户的正则表达式安全吗?

php - 我有一个登录表单,其中有一个单击 Enter 键提交表单的事件,它在 IE 中不起作用

mysql - MySQL 中何时使用单引号、双引号和反引号

php pdo 在函数返回中准备

php - 需要把mysql的数据以某种格式打印成json

php - 拆分数组以在另一个数组中使用时出现问题

php - Virtuemart 和自动导入我的数据库中的文件