【发布时间】:2017-01-15 11:52:46
【问题描述】:
我正在编写一个存储过程。在其中我有以下 mysql 插入语句:
INSERT INTO `Address`(`countryCode`, `addressLine1`, `addressLine2`, `postcode`, `region`, `city`) VALUES (country, addressLine1, addressLine2, postcode, region, city);
INSERT INTO `UserAddress`(`username`, `creationDate`, `addressId`) VALUES (username,NOW(),(SELECT addressId FROM Address ORDER BY addressId DESC LIMIT 1));
如您所见,我正在对地址表执行插入操作,然后在下一行的子查询中使用自动递增的“addressId”。现在,如果在这两个语句之间,另一个事务将向 Address 表中插入一些内容,我会将错误的 addressId 插入到 UserAddress 表中。我的猜测是我需要在执行这些语句时锁定地址表。
经过长时间的搜索,我找到了以下代码来锁定地址表:
SELECT addressId FROM Address FOR UPDATE;
这也适用于新插入的行吗?如果没有,会怎样?
【问题讨论】:
-
您是否总是将两行插入在一起?如果是这样,为什么将它们插入单独的表中?我认为你的设计有问题。
-
如果你真的需要这样做,我可能会考虑使用事务。但正如@GurV 所说,您可能遇到了设计问题。
-
@GurV 这是一个设计问题吗?这个想法是用户可以有多个地址。此外,一个地址可以是多个用户。此外,地址具有创建日期。我需要在 Address 和 User 表之间有一个表,对吗?
-
代码,如所写,仅处理 1:1。它不允许 1:many、many:1 和 many:many。您需要 IODKU、唯一键和/或它们的映射表。
-
用户和地址之间存在多对多关系。中间的表是 UserAddress。我的代码仍然可以这样做吗?
标签: mysql stored-procedures concurrency innodb