Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为MySQL InnoDB存储过程中的插入锁定表_Mysql_Stored Procedures_Concurrency_Innodb - Fatal编程技术网

为MySQL InnoDB存储过程中的插入锁定表

为MySQL InnoDB存储过程中的插入锁定表,mysql,stored-procedures,concurrency,innodb,Mysql,Stored Procedures,Concurrency,Innodb,我正在写一个存储过程。其中我有以下mysql insert语句: INSERT INTO `Address`(`countryCode`, `addressLine1`, `addressLine2`, `postcode`, `region`, `city`) VALUES (country, addressLine1, addressLine2, postcode, region, city); INSERT INTO `UserAddress`(`username`, `creationD

我正在写一个存储过程。其中我有以下mysql insert语句:

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”。现在,如果在这两条语句之间,另一个事务将在地址表中插入某些内容,那么我将在UserAddress表中插入错误的addressId。我猜我需要在执行这些语句时锁定地址表

经过长时间的搜索,我找到了以下锁定地址表的代码:

SELECT addressId FROM Address FOR UPDATE;

这是否也适用于新插入的行?如果没有,您会怎么做?

理想情况下,您应该在
事务中使用“启动事务;”来执行此操作和“提交”语法。您还需要将
autocommit
设置为0(默认情况下启用)。是交易和自动提交的文档


只要您的更新被包装在一个事务中并且设置了适当的设置,其他事务所做的更改就不会影响您的事务

这就是为什么他们发明了


获取最后一个id的任务不需要锁或事务,甚至不需要存储过程。只需在应用程序中执行此操作。

是否总是将这两行插入到一起?如果是,为什么要将它们插入单独的表中?我认为您的设计有问题。如果您真的需要这样做,我可能会考虑使用事务。但正如@GurV所说,您可能有设计问题。@GurV这是一个什么样的设计问题?其思想是用户可以有多个地址。此外,一个地址可以是多个用户的地址。此外,地址还有一个创建日期。我需要一个位于地址表和用户表之间的表,对吗?编写的代码只处理1:1。它不允许1:many,也不允许many:1,也不允许many:many。您需要IODKU、唯一键和/或映射表。用户和地址之间存在多对多关系。中间的表是UserAddress。这在我的代码中仍然是可能的,对吗?将我的每个存储过程包装在一个启动事务中是好的设计吗和“在过程中提交?不是所有的,而是需要隔离的位,就像你在问题中提到的。这样想。。。在这里:查询1:从你的银行账户中取出一些钱;问题2:把钱存入你的储蓄账户。如果服务器在查询1和查询2之间崩溃怎么办?这是需要
BEGIN的经典例子;问题1;问题2;承诺以便两者都成功或两者都不成功。如果你的应用程序有类似的功能,你就需要事务。这是并发安全的吗?令人惊叹的!很高兴帮助
LAST\u INSERT\u ID()
是本地连接;因此,“货币安全”。但我不同意不需要“交易”。如果服务器在两次自动提交的
插入之间崩溃,则没有这样的设置,您可以存储
地址
,但不能存储
用户地址
。是的,@RickJames有一点关于事务。不过,在我的回答中,我纯粹是在获取最后一次插入的ID的背景下进行的。
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(),LAST_INSERT_ID());