Blocage détecté dans les fonctions PL/pgSQL

Je suis confronté à un problème de blocage à partir d'une de fonctions PL/pgSQL dans ma base de données PostgreSQL. S'il vous plaît trouver l'instruction SQL dans le bloc de code (juste un exemple):

BEGIN
UPDATE accounts SET balance = 0 WHERE acct_name like 'A%';
UPDATE accounts SET balance = balance + 100 WHERE acct_name like '%A';
EXCEPTION WHEN OTHERS THEN RAISE NOTICE SQLERRM;
END;

J'ai trouvé que le blocage s'est produit au cours de la présente déclaration a été en cours d'exécution. Mais je ne suis pas sûr qu'il y avait d'autres états essayer de mettre à jour ce tableau dans le même temps (parce que je n'ai pas trouvé dans mon système de journalisation).

Donc, est-il possible que le blocage s'est produit à l'intérieur de cette déclaration? Autant que je sache, si nous avons bloqué intégralité de la déclaration avec BEGIN/END. Il y aura la même transaction et ne doit pas être verrouillé par lui-même.

Vous disposez de tous les déclencheurs sur les comptes? Aussi, ne vous utilisation explicite de verrouillage?
Par défaut, une transaction peut observer les changements engagés par d'autres transactions. Pour plus d'informations, voir l'Isolation de la Transaction de la documentation PostgreSQL.
Oui je l'ai, mais la déclaration que le déclencheur n'est pas liée à cette table. Pour l'explicite de verrouillage est également oui.

OriginalL'auteur Sathapanic Sriprom | 2012-04-09