如何知道mysql INSERT何时完成(多个连接)

时间:2011-03-08 14:34:20

标签: mysql select insert

我有这样的多数据库连接情况:

db connection 1: INSERT xyz
(very short time passes)
db connection 2: SELECT [looking for xyz]

有时SELECT会找到xyz,有时却找不到(因为它与INSERT的数据库连接不同)。如果我在sleep(1)总是找到INSERT then the SELECT后放置xyz

对于数据库连接1,如何让它等到INSERT完成并且新行可用于在另一个数据库连接上运行的SELECTs

我的表格是innodb。用例是在连接1上插入经过身份验证的会话ID,然后重定向到经过身份验证的页面,然后当对经过身份验证的页面的请求进入时(在另一个连接上),我们会查找会话ID以对请求进行身份验证。如果我们减慢登录速度并使其等到INSERT完全结束,这样就可以了,这样经过身份验证的会话ID在返回之前可用于其他请求。

2 个答案:

答案 0 :(得分:2)

第一个问题,为什么同一个用户有两个不同的连接?

如果你真的想要保持两个会话,你可以使用table locking

连接1,发送这些sql语句:

LOCK TABLE mytable WRITE; -- mytable is know locked, nobody else can access it
INSERT xyz; -- insert data in database
UNLOCK TABLES; -- unlock the table, the rows ARE inserted

连接2:

SELECT [looking for xyz]

如果连接2在连接1解锁表之前尝试访问数据库,则连接必须等待。当表被解锁时,将插入行,因此select将返回想要的结果。

答案 1 :(得分:0)

因为insert语句是一个事务;一旦你的insert语句完成,它就在数据库中;我假设这两个与数据库的连接是使用两个不同的线程进行的;并且你同时发出两个命令(此时,还没有插入xyz。

根据您描述的用例,我不确定这是否应该通过两个不同的数据库连接。然而;首先应该证明是虚假的;您可能希望使用锁定文件或其他内容来指示“事务”真正完成。