当我开发一个GUI窗口应用程序时,我看到在PostgreSQL中插入一行的奇怪行为。
我的应用程序(由Xojo构建)构建了一个作业元信息并将其插入到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

更正。
我注意到有另一个更新语句来更新同一个表。
然而,INSERT和UPDATE处理的是不同的行,但它们似乎相互阻塞,即使没有锁信息。

最佳答案

在开始事务步骤之后,您应该检查是否有任何错误。任何使用SQLExecute的操作都可能导致数据库错误。我打赌你会收到一条错误信息,可能会告诉你到底发生了什么。

10-06 10:12