質問: $_SESSION['join2']['programs_year1_']; for($i=0;$iprepare("INSERT INTO user_skill(・・・) VALUES (・・・)"); $stmt->execute([ $user_id, $programs1[$i], $year1[$i] ]); } ``` プログラムの処理の流れはこうですが、 1. user_dataへ登録(ユーザーAによる登録) 2. user_skill を作成(ユーザーAによる登録) 例えば銀行のようにミリ秒でDBへのアクセスが頻繁なサービスがあったとします。 1. user_dataへ登録(ユーザーAによる登録) 2. user_dataへ登録(ユーザーBによる登録) 3. user_skill を作成(ユーザーAによる登録) 4. user_skillへ登録(ユーザーBによる登録) lastInsertId()は最後の追加された行のIDを返すとのことですが、この場合、 1. user_skill を作成(ユーザーAによる登録) のuser_idは 2. user_dataへ登録(ユーザーBによる登録) のIDにならない理由を教えてください。 順序的には 最後に追加された行(lastInsertId()の直近に記述しているテーブル)のIDを返すはずなので 競合しないのは何故かと不思議に思っています。
回答: たとえば ``` create table hoge(id int not null auto_increment primary key,val1 varchar(10)); insert into hoge(val1) values('a'),('b'),('c'); create table fuga(id int,val2 varchar(10)); ``` として、 ``` insert into hoge(val1) values('d'); select sleep(5); insert into fuga(id,val2) values(last_insert_id(),'x'); ``` を実行後、**並行して**5秒以内に ``` insert into hoge(val1) values('e'); insert into fuga(id,val2) values(last_insert_id(),'y'); ``` を実行すれば dを挿入したhogeのid=4を引き継いでfugaのid=4の値はx、 同様にeを挿入したhogeのid=5を引き継いでfugaのid=5の値はyとなり 同じセッション内での最終挿入idを引き継いでいることがわかると思います