2016-08-06 5 views
1

私はGUIウィンドウアプリケーションを開発しているが、PostgreSQLに行を挿入するときに奇妙な動作が見られる。同時挿入によりGUIがフリーズする(Windowsアプリケーション/ PostgreSQL)

私のアプリケーション(Xojoで構築)はJOBメタ情報を作成し、それをPostgreSQLに挿入するので、それぞれ1行ずつ挿入する5つのジョブを実行しようとしました。 GUIアプリケーションをフリーズします。 4つのジョブを実行すると問題は発生しませんが、5が原因です。

コードをロギングしようとしましたが、ジョブの1つが「BEGIN TRANSACTION」ステートメントで渡されないことがわかりました。 データベースにロック情報がありません。そのため、私は立ち往生しています。

おそらく、同じテーブルに同時に行を挿入するにはいくつかの制限がありますか? ini_trans(Oracle)の数が少ないため、同時DMLが停止することがありました。 PostgreSQLにその機能があるかどうかはわかりません。

各ジョブは、1行をコミットするには、以下の手順を実行する必要があります。

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を使用するものは、データベースエラーを引き起こす可能性があります。私はあなたがおそらく正確に何が起こっているのかを伝えるエラーメッセージを受け取ることに賭けています。

+0

問題は少し複雑で、実際にはジョブはShellのDataAvailableイベントで実行されていると思います。私はDataAvailableイベントがJobsの競合を引き起こし、DataAvailableイベントを削除しようとしたと考え、ジョブ処理を確認するために新しいイベントを実装しました。その後、私はGUIの凍結の問題は表示されません。以前のエラーを見つけようとします。ありがとうございました。 – Sigularity

関連する問題