我有一个程序QT首先插入值表与自动增加列"表a"。然后,它将表A和表B的值连接起来,插入到表C中(我需要在表C上使用最近创建的id)。
我的问题是,在表A上的插入完成之前,程序开始向表C插入,因此表C上的记录数量是不完整的。
如果我手动在表A上运行插入,然后等待并在表C上插入,所有记录都显示出来,因此查询是正确的。
代码_query.exec("Insert into tableA values(...........)"); --This inserts 3000 records
_query.exec("Insert into tableC (select * from tableA)"); --This inserts 2500 values
如果我在代码中注释第二个查询并执行它
_query.exec("Insert into tableA values(...........)"); --This inserts 3000 records
//_query.exec("Insert into tableC (select * from tableA)");
然后在pgphpadmin
上运行查询Insert into tableC (select * from tableA) --This inserts 3000 records
它插入了3000条记录
我的猜测是程序在继续进行下一个查询之前没有等待第一次插入完成。
我的猜测是程序没有等待第一次插入在继续下一个查询之前完成。
从Qt-5.3开始,QPSQL postgres驱动程序使用同步PQexec()
调用来实现QSqlQuery::exec()
,因此在查询完全完成之前它不可能返回。
此外,即使它使用像PQsendQuery()
这样的异步调用,这种情况仍然是不可能的,因为相同的连接不能启动一个新的SQL语句,直到它完成了前一个。
你的程序需要在多个线程中有多个打开的连接来提交并行查询。这不是那种不经意间发生的事情。
即使它有这些,由于事务的隔离属性,从任何其他连接中都无法看到未完成的INSERT的影响。如果第一次INSERT还没有完成/提交,那么第二次INSERT将看不到第一次INSERT中的任何行;如果第一次INSERT已经完成/提交,那么第二次INSERT将看到所有行。
可以从服务器外部看到半加载数据的罕见情况是COPY FREEZE
,但这不是INSERT。
我继续调查,我的一段代码是多线程的。线程有一个问题,程序没有等待所有线程完成。这就是为什么这个项目似乎没有等待足够的时间。
谢谢你的帮助