GUI ウィンドウ アプリケーションを開発しているときに、PostgreSQL に行を挿入すると奇妙な動作が見られます。
私のアプリケーション (Xojo によって構築された) は、JOB メタ情報を構築し、それを PostgreSQL に挿入します。それぞれ 1 つの行を挿入する 5 つのジョブを実行しようとしました。GUI アプリケーションをフリーズします。4 つのジョブを実行しても問題はありませんが、5 つのジョブでこの問題が発生します。
コードをログに記録しようとしましたが、「BEGIN TRANSACTION」ステートメントでジョブの 1 つを渡すことができなかったことがわかりました。データベースにロック情報がないため、立ち往生しています。
おそらく、同じテーブルに同時に行を挿入するにはいくつかの制限がありますか? 少数の 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は別の行を扱いますが、ロック情報がないのにお互いをブロックしているようです。