0

我最近从 SQL Server 切换到 MySQL,但我在任何地方都找不到这个问题的足够可靠的答案:

我在需要锁定的表上使用 PHP、MySQL 和 InnoDB 表引擎。因此,对于标准系列的 3 个语句:

  1. 插入表 A
  2. $id = $mdb2->lastInsertID()
  3. 插入表 B (name, fk) VALUES ('foo', $id)

我需要采取哪些步骤来确保 $id 具有步骤 1 中插入的值?它现在这样好吗?一切都需要在交易中吗?我是否需要添加其他查询来锁定和释放表?

多谢你们。

4

2 回答 2

4

你应该/可以,但你不需要做任何事情: information-functions , function_last-insert-id

生成的 ID 在每个连接的基础上维护在服务器中。这意味着函数返回给给定客户端的值是为影响该客户端的 AUTO_INCREMENT 列的最新语句生成的第一个 AUTO_INCREMENT 值。此值不受其他客户端的影响,即使它们生成自己的 AUTO_INCREMENT 值。这种行为确保每个客户端都可以检索自己的 ID,而不用担心其他客户端的活动,也不需要锁或事务。

于 2012-01-14T18:08:53.463 回答
0

如果任何查询失败,至少可以回滚其他更新,最好使用事务。

或自行处理

如果第 3 步失败,您将收到来自 mysql 的错误消息,将该消息存储在变量中,并检查是否收到删除第 1 步中插入的记录。

这就是事务处理的全部内容。你应该使用事务。

于 2011-04-11T15:17:24.993 回答