我觉得这很难解释,但请考虑以下情况:
您有一个网站,其中包含两个紧接着加载的插入查询,可能有一些变量声明和介于两者之间的 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
查询运行),就不存在这种风险。