并发插入冻结GUI(Windows应用程序/ PostgreSQL)

时间:2016-08-06 11:19:25

标签: postgresql xojo

当我开发GUI窗口应用程序时,我发现在PostgreSQL中插入行时会出现奇怪的行为。

我的应用程序(由Xojo构建)构建一个JOB元信息并将其插入到PostgreSQL中,我尝试运行5个作业,每个作业插入一行。 它冻结了GUI应用程序。 当我运行4个工作时,我没有看到任何问题,但是5导致了这个问题。

尝试记录代码,我发现其中一个作业无法通过“BEGIN TRANSACTION”语句传递。 数据库中没有锁信息,这就是我被卡住的原因。

可能在同一个表中同时插入行有一些限制吗? 有时,由于ini_trans(Oracle)数量较少,并发DML可能会卡住。我不确定PostgreSQL是否具有该功能。

每个作业都应通过以下步骤提交一行。

  mPostgreSQLDB.SQLExecute("BEGIN TRANSACTION")
  mPostgreSQLDB.SQLExecute (insert_statement)

  If mPostgreSQLDB.Error then
    Logging("DML failed. Error: " + mPostgreSQLDB.ErrorMessage + " Rollbacked " )
    mPostgreSQLDB.Rollback
  Else
    mPostgreSQLDB.Commit
  End If

校正。

我注意到在同一个表中有另一个UPDATE语句。 但是,INSERT和UPDATE会处理不同的行,但即使没有锁定信息,它们似乎也会相互阻塞。

1 个答案:

答案 0 :(得分:1)

您应该在BEGIN TRANSACTION步骤后检查是否有任何错误。任何使用SQLExecute的东西都可能产生数据库错误。我打赌你会收到一条错误信息,可能会告诉你究竟发生了什么。