繁体   English   中英

PDO是否有机会返回带有静态/单个共享数据库对象的最后一个“错误”插入的ID?

[英]Any chance PDO will return a “wrong” last inserted ID with a static/singleton shared database object?

对于MySQL / PDO,我相信PDO :: lastInsertID()返回该连接最后插入的对象的ID。 我的PDO对象包含在任何方法都可以调用的singleton对象中,因此每个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,该ID是查询A的结果,而查询B是
  4. 方法B询问最后插入的ID,该ID期望并获取查询B的结果

已经阅读这些,找不到答案:

PDO最后插入ID总是正确的吗? http://php.net/manual/en/pdo.lastinsertid.php

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

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

HTTP和单例与此处无关。

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

  • 这样的矛盾肯定是一场灾难
  • 单例是一种流行的模式
  • HTTP也是相当流行的协议
  • 您不是使用这些技术的唯一程序员

您可以得出一个结论:只要您找不到有关此类灾难的任何证据-很可能从未发生过。

真诚的,上校。 常识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM