2016-08-06 5 views
1

Pendant que je développe une application de fenêtre GUI, je vois un comportement étrange lors de l'insertion d'une ligne dans PostgreSQL.L'encart simultané gèle l'interface utilisateur graphique (application Windows/PostgreSQL)

Mon application (construite par Xojo) construit une méta-information JOB et l'insère dans PostgreSQL, et j'ai essayé d'exécuter 5 tâches en insérant chacune une ligne. Il gèle l'application GUI. Lorsque je cours 4 travaux, je ne vois aucun problème, mais 5 cause ce problème.

J'ai essayé de consigner des codes, et je vois que l'un des travaux n'a pas pu être passé sur l'instruction "BEGIN TRANSACTION". Il n'y a pas d'informations de verrouillage dans la base de données, c'est pourquoi je suis coincé.

Probablement, il existe une certaine limite pour insérer des lignes simultanément dans la même table? Parfois, en raison du petit nombre d'ini_trans (Oracle), DML concurrent peut rester bloqué. Je ne suis pas sûr si PostgreSQL a cette fonctionnalité ou non.

Chaque travail doit passer par les étapes ci-dessous pour valider la ligne.

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 

Correction.

J'ai remarqué qu'il existe une autre instruction UPDATE pour dater la même table. Toutefois, INSERT et UPDATE traitent une ligne différente, mais il semble qu'ils se bloquent même s'il n'y a pas d'informations de verrouillage.

Répondre

1

Vous devez rechercher toute erreur après l'étape BEGIN TRANSACTION. Tout ce qui utilise SQLExecute pourrait potentiellement créer une erreur de base de données. Je parie que vous obtiendrez un message d'erreur qui vous dira probablement exactement ce qui se passe.

+0

Je pense que le problème est un peu complexe et que les tâches sont en cours d'exécution avec l'événement DataAvailable de Shell. Je pensais que l'événement DataAvailable risquait de provoquer davantage de conflits de Jobs afin de supprimer les événements DataAvailable et d'en implémenter un nouveau pour vérifier le traitement des travaux. Après cela, je ne vois aucun problème de gel de l'interface graphique. Je vais essayer de trouver l'erreur précédente. Je vous remercie. – Sigularity