当多个用户在短时间窗口完成时,堆叠查询是否可以在彼此之间潜入?

时间:2016-02-18 10:53:38

标签: php mysql mysqli

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

你有一个网站有两个插入查询,它们可以在彼此之后加载,可能有一些变量声明和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的风险,或者是否保证查询将按顺序执行而不会在它们之间调用任何其他查询?

1 个答案:

答案 0 :(得分:4)

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

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

回答你的问题:

  

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

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

  

是否存在一个用户可能从另一个用户那里获得最后一个插入ID的风险

没有。只要两个查询(自动生成INSERT的{​​{1}}和调用AUTO INCREMENT的查询)在同一连接上运行(并且没有其他{{},就不存在此类风险1}}查询在同一连接上运行它们。)