1

对于 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 总是正确的? http://php.net/manual/en/pdo.lastinsertid.php

4

1 回答 1

2

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

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

HTTP 和单例在这里无关。

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

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

你可以得出一个结论:只要你找不到任何关于这种灾难的证据——很可能它从未存在过。

此致,上校。常识。

于 2013-11-01T05:36:06.530 回答