В функции PL/pgSQL обнаружена взаимоблокировка

Я столкнулся с проблемой взаимоблокировки из-за функции PL/pgSQL в моей базе данных PostgreSQL. Пожалуйста, найдите оператор SQL в блоке кода (просто пример):

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;

Я обнаружил, что тупиковая ситуация возникла во время выполнения этого оператора. Но я не уверен, что в то же время были другие операторы, пытающиеся обновить эту таблицу (потому что я не нашел их в своей системе ведения журнала).

Итак, возможно ли, что тупиковая ситуация произошла внутри этого оператора? Насколько я знаю, если бы мы заблокировали весь оператор с помощью BEGIN/ END. Будет такая же транзакция и не должна блокироваться сама по себе.

13
задан Erwin Brandstetter 26 May 2017 в 14:50
поделиться