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

时间:2019-07-14 10:23:07

标签: php mysql pdo last-insert-id

我在这里阅读了有关PDO::lastInsertId()及其安全性的一些主题。它会从当前连接中返回最后插入的ID(因此对于多用户应用程序来说是安全的,而每个用户/脚本运行只有一个连接)。

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

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

1 个答案:

答案 0 :(得分:1)

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

做到这一点最好的方法,也是我认为唯一可维护的方法,是使您的连接成为线程私有的。

如果您尝试从多个线程使用一个连接,则您的MySQL服务器可能会抛出Packet Out of Order错误。

“最后插入ID”功能可确保与MySQL的多个连接获得自己的ID值,即使多个连接确实对同一表进行了插入操作。

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

最后插入ID被设计为在这种情况下是安全的。

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

某些php程序可能使用线程。在这种情况下,程序必须避免允许多个线程同时使用同一连接,否则将导致可怕的Packet Out of Order错误。

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