PostgreSQLデータベースのPL/pgSQL関数のデッドロック問題が発生しました。コードブロック(例)のSQL文を見つけてください:PL/pgSQL関数でデッドロックが検出されました
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
で声明全体をブロックしたとします。同じトランザクションがあり、ロックされてはいけません。
アカウントにトリガーがありますか?また、明示的なロックを使用していますか? – strkol
デフォルトでは、トランザクションは他のトランザクションによってコミットされた変更を監視できます。詳細については、PostgreSQLのマニュアルから[Transaction Isolation](http://www.postgresql.org/docs/current/static/transaction-iso.html)を参照してください。 –
@strkolはい、ありますが、そのトリガーのステートメントはこのテーブルに関係しません。明示的なロックのためにもyesです。 –