我有这样的多数据库连接情况:
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在返回之前可用于其他请求。
答案 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。
根据您描述的用例,我不确定这是否应该通过两个不同的数据库连接。然而;首先应该证明是虚假的;您可能希望使用锁定文件或其他内容来指示“事务”真正完成。