QT - Postgresql - 在开始另一个插入之前等待插入完成

时间:2014-07-31 14:55:18

标签: sql qt postgresql insert transactions

我有一个关于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条记录

我的猜测是程序在继续下一个查询之前不会等待第一次插入完成。

2 个答案:

答案 0 :(得分:0)

  

我的猜测是该程序不会等待第一次插入   在继续下一个查询之前完成。

从Qt-5.3开始,QPSQL postgres驱动程序使用同步PQexec()调用来实现QSqlQuery::exec(),因此在查询完全完成之前返回它是不可能的。

此外,即使它使用了像PQsendQuery()这样的异步调用,这种情况仍然是不可能的,因为相同的连接在完成前一个SQL语句之前无法启动它。< / p>

您的程序需要在多个线程中有多个打开的连接才能提交并行查询。这不是那种无意中发生的事情。

即使它有这些,由于事务的isolation属性,也无法从任何其他连接看到半完成的INSERT的效果。如果第二个INSERT未完成/已提交,则第一个INSERT将看不到任何行,如果它已完成/已提交,则第二个INSERT将看不到所有行。

从服务器外部看到半载数据的罕见情况是COPY FREEZE,但这不是INSERT。

答案 1 :(得分:0)

我一直在调查,我的一段代码做了多线程。线程出现问题,程序没有等待所有线程完成。这就是为什么程序似乎没有等待的原因。

感谢您的帮助