Я пишу хранимую процедуру. В этом у меня есть следующие MySQL операторы вставки:Блокировка таблицы для вставок из MySQL InnoDB Сохраненная процедура
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, я бы ввел неправильный адрес в таблицу UserAddress. Я предполагаю, что мне нужно заблокировать таблицу Address, пока эти инструкции выполняются.
После долгих поисков я нашел следующий код, чтобы заблокировать адресную таблицу:
SELECT addressId FROM Address FOR UPDATE;
Будет ли это работать для вновь добавленных строк? Если нет, что бы?
Вы всегда будете вставлять два ряда вместе? Если да, зачем вставлять их в отдельные таблицы? Я думаю, что у вашего дизайна есть проблема. – GurV
Если вам действительно нужно это сделать, я могу подумать об использовании транзакции. Но, как говорит @GurV, у вас может возникнуть проблема с дизайном. –
@GurV Как это проблема дизайна? Идея состоит в том, что пользователи могут иметь несколько адресов. Кроме того, один адрес может быть нескольких пользователей. Кроме того, у адреса есть дата создания. Мне нужна таблица между таблицами «Адрес» и «Пользователь», а затем правильно? –