MySQL Insert Race Condition – Education Career Blog

I have a webapp that currently stores all of a user’s searches into a search_log table. I now want to create another table called results_log that stores all the results we supply to the user. The search_log table contains a primary key called id_search and the results log table has the foreign key id_search, and one other field id_result. The id_searched field is an auto_incrementing field in both tables.

In my web app I would do the inserts in this sequential order:

  insert into search_log table
  insert into result_log table

I am worried this may cause a race condition. If user A and user B both finish the webapp and reach this part of the code at about the same time, is it possible that the order would go:

  User A -> Insert into search_log
  User B -> Insert into search_log
  User B -> Insert into result_log
  User A -> Insert into result_log

Since both tables are auto_incrementing on the id_search field, I’m worried User A and User B will have their data swapped. I also thought about querying for the id_search, but it seems like a even worse solution.

My question is:
-Is there a way to fix this race condition?
-Would one solution be inserting into two tables with one SQL query? Is this possible?


If those tables are related, then you should include the auto increment ID with when inserting. After inserting into search_log, get the last insert ID, no lookup needed. Then include that in the result_log search as another field.

Never rely on auto increment IDs being the same in different tables.

Leave a Comment