对于 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 实例之间共享,而且由于代码中没有并发性,我认为它应该线性发生。所以我认为这种情况不会发生:
- 方法 A 使用查询 A 插入一行
- 方法 B 使用查询 B 插入一行
- 方法 A 要求最后插入的 ID 期望查询 A 的结果,而不是查询 B 的结果
- 方法 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/