PDO::lastInsertId() 在多线程单连接中安全吗?

Is PDO::lastInsertId() in multithread single connection safe?

我在这里阅读了一些关于 PDO::lastInsertId() 及其安全性的话题。它 returns 来自当前连接的最后插入 ID(因此对于多用户应用程序是安全的,因为每个 user/script 运行 只有一个连接)。

我只是想知道如果在 多核服务器系统中每个长脚本(很多 SQL 请求)只有一个数据库连接,是否有可能获得无效 ID?这个问题更有可能是理论性的。

我认为 PHP 脚本 运行 是线性的,但也许我错了。

PDO本身不是线程安全的。如果从线程应用程序使用 PDO 连接,则必须提供自己的线程安全。

最好的,也是我认为唯一可维护的方法是建立联系 thread-private。

如果您尝试使用来自多个线程的一个连接,您的 MySQL 服务器可能会抛出数据包乱序错误。

最后插入 ID 功能可确保到 MySQL 的多个连接获得它们自己的 ID 值,即使多个连接对同一个 table 执行插入操作也是如此。

对于典型的 php Web 应用程序,使用多核服务器可以处理更多 web-browser 请求。多核服务器不会使 php 程序成为多线程。每个 php 程序,处理每个 Web 请求,分配自己的 PDO 连接。正如您所说,每个 php 脚本 运行 都是“线性的”。多核允许多个脚本同时 运行,但独立。

Last Insert ID 旨在为该场景提供安全保障。

在某些情况下,php 程序可能会在完成后让 MySQL 连接保持打开状态,以便另一个 php 程序可以使用它。这称为持久连接或连接池。当网站有许多用户连接时,它有助于提高性能。可重用连接的通用术语是“串行可重用资源。*

一些 php 程序可能会使用线程。在这种情况下,程序必须避免允许多个线程同时使用同一连接,否则会出现可怕的数据包乱序错误。

(几乎所有机器都有多个内核。)