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

Posted

技术标签:

【中文标题】并发插入冻结 GUI(Windows 应用程序/PostgreSQL)【英文标题】:Concurrent insert freezes GUI(Windows application/PostgreSQL) 【发布时间】:2016-08-06 11:19:25 【问题描述】:

当我开发一个 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】:

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

【讨论】:

我认为这个问题有点复杂,实际上作业是通过 Shell 的 DataAvailable 事件运行的。我认为 DataAvailable 事件可能会导致更多的作业争用,因此尝试删除 DataAvailable 事件,并实施新的事件来检查作业处理。之后,我看不到任何 GUI 冻结问题。我将尝试找到以前的错误。谢谢。

以上是关于并发插入冻结 GUI(Windows 应用程序/PostgreSQL)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle JRE 1.8_281 GUI 冻结

PyQt:如何在不冻结 GUI 的情况下更新进度?

Pyside2 QGuiApplication,Gui冻结按钮点击

如何修复 PyQt5 GUI 冻结

Pyqt Gui 在循环中冻结

如何使用 cx_Freeze 冻结双模式(GUI 和控制台)应用程序?