我有一个关于QT的程序,它首先使用自动增加列将值插入表中,并且#34;表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条记录
我的猜测是程序在继续下一个查询之前不会等待第一次插入完成。
答案 0 :(得分:0)
我的猜测是该程序不会等待第一次插入 在继续下一个查询之前完成。
从Qt-5.3开始,QPSQL postgres驱动程序使用同步PQexec()
调用来实现QSqlQuery::exec()
,因此在查询完全完成之前返回它是不可能的。
此外,即使它使用了像PQsendQuery()
这样的异步调用,这种情况仍然是不可能的,因为相同的连接在完成前一个SQL语句之前无法启动它。< / p>
您的程序需要在多个线程中有多个打开的连接才能提交并行查询。这不是那种无意中发生的事情。
即使它有这些,由于事务的isolation属性,也无法从任何其他连接看到半完成的INSERT的效果。如果第二个INSERT未完成/已提交,则第一个INSERT将看不到任何行,如果它已完成/已提交,则第二个INSERT将看不到所有行。
从服务器外部看到半载数据的罕见情况是COPY FREEZE
,但这不是INSERT。
答案 1 :(得分:0)
我一直在调查,我的一段代码做了多线程。线程出现问题,程序没有等待所有线程完成。这就是为什么程序似乎没有等待的原因。
感谢您的帮助