我在寫一個存儲過程。在這裏面,我有以下的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表中插入錯誤的addressId。我的猜測是我需要鎖定地址表,而這些語句正在執行。
經過長時間的搜尋後,我發現下面的代碼鎖定地址表:
SELECT addressId FROM Address FOR UPDATE;
這是否也爲新插入的行工作?如果不是,會怎麼樣?
你會一直將兩行插入在一起嗎?如果是這樣,爲什麼將它們插入單獨的表中?我認爲你的設計有問題。 – GurV
如果您確實需要這樣做,我可能會考慮使用事務。但正如@GurV所說,你可能會遇到設計問題。 –
@GurV它是如何設計的問題?這個想法是用戶可以有多個地址。另外,一個地址可以是多個用戶。另外,地址有創建日期。我需要在地址和用戶表之間有一個表格,然後呢? –