2010-10-14 124 views
0

我有一个webapp,当前将所有用户的搜索存储到search_log表中。我现在要创建另一个名为results_log的表,其中存储了我们提供给用户的所有结果。 search_log表包含名为id_search的主键,并且结果日志表具有外键id_search和另一个字段id_result。 id_searched字段是两个表中的auto_incrementing字段。MySQL插入竞争条件

在我的web应用程序,我会做插件在这个顺序:

insert into search_log table 
    insert into result_log table 

我担心这可能会导致竞争条件。如果用户A和用户B都完成web应用程序,并在大约同一时间到达这部分代码,是有可能的是,为了将去:

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

由于两个表上id_search场auto_incrementing,我很担心用户A和用户B将交换数据。我也想过查询id_search,但它似乎更糟糕的解决方案。

我的问题是: - 有没有办法解决这种竞争条件? - 一种解决方案可以通过一个SQL查询插入到两个表中吗?这可能吗?

回答

1

如果这些表格是相关的,那么您应该在插入时包含自动增量ID。插入到search_log后,获取最后一个插入ID,不需要查找。然后将其作为另一个字段包含在result_log搜索中。

永远不要依赖自动增量ID在不同的表中相同。

+0

我认为这样做,但如果用户A插入到search_log表中,然后在可以查询最后一个插入ID之前,用户B将插入到search_log表中。我可以结束与两个用户具有相同的search_id权利? – user387049 2010-10-14 16:07:52

+2

你不会“查询”最后一个插入ID,它是一个MySQL函数。它返回会话中最后一个插入的插入ID。 – 2010-10-15 20:54:38