当多个用户在短时间内完成时,堆叠查询是否有可能相互渗透


Is it possible for stacked queries to sneak in between eachother when done by multiple users in short time windows?

我觉得这很难解释,但请考虑以下情况:

您有一个网站,其中包含两个紧接着加载的插入查询,可能有一些变量声明和介于两者之间的 for 循环,但除了这两个查询之外,没有其他查询:

$mysqli->doQuery("INSERT INTO `company_order`(`customer_id`, `item_id`) 
                                      VALUES ($givenid, $givenproduct")
// This table has a primary key that gets defined using auto_increment.
/* (loop that defines array with 50~ variables, few names that get defined in object variables) */
$mysqli->doQuery("INSERT INTO `customer_orderlist`(`customer_id`,`order_id`) 
                                           VALUES ($givenid, (LAST_INSERT_ID()) ")

想象一下,如果两个用户加载了几乎紧接着执行这些查询的相同函数。是否存在一个用户可能从其他用户那里获取最后插入的 ID 的风险,或者是否保证查询将按顺序执行,而不会在它们之间调用任何其他查询?

MySQL 函数LAST_INSERT_ID()返回在当前连接上执行的最新成功INSERT语句,为AUTO INCREMENT列成功插入的第一个自动生成的值。

该值由服务器基于每个连接进行存储。这保证了LAST_INSERT_ID()在第二个查询上返回的值是为第一个查询上的AUTO INCREMENT列生成的值,无论在其他连接上运行了多少其他INSERT查询。

要回答您的问题:

是否可以保证查询将按顺序执行,而不会在它们之间调用任何其他查询?

不,没有这样的保证。查询按照您将其发送到服务器的顺序执行,但您的连接不会阻止其他连接执行自己的查询(反之亦然)。

是否存在一个用户可能从另一个用户获取上次插入的 ID 的风险

不。只要两个查询(自动生成AUTO INCREMENT值的INSERT和调用LAST_INSERT_ID()的查询)在同一连接上运行(并且在同一连接上它们之间没有其他INSERT查询运行),就不存在这种风险。