为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
HUWWW 2021-10-08 15:32:59
我在这里阅读了一些关于PDO::lastInsertId()其安全性的主题。它从当前连接返回最后插入的 ID(因此对于多用户应用程序来说是安全的,而每个用户/脚本运行只有一个连接)。我只是想知道如果多核服务器系统中每个长脚本(大量 SQL 请求)只有一个数据库连接,是否有可能获得无效 ID ?这个问题更可能是理论上的。我认为 PHP 脚本运行是线性的,但也许我错了。
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

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 错误。

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


查看完整回答
反对 回复 2021-10-08
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信