views:

19

answers:

1

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?

+1  A: 

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.

Brent Baisley
I considered doing that, but what if User A inserts into the search_log table and then before I can query for the last insert ID, User B inserts into the search_log table. I could end up with two User's having the same search_id right?
You don't "query" for the last insert ID, it's a MySQL function. It returns the insert ID for the last insert in your session.
Brent Baisley