我在 PostgreSQL 9.4.5 上遇到锁定问题。我同时运行两个或多个事务(通常有 2 个同时运行,但有时会发生 2 个以上)从相同的表读取但在不同的输出表上写入。在我的交易中,我有几个声明某些功能的语句DROP FUNCTION IF EXISTS
。CREATE OR REPLACE FUNCTION
我的猜测是,DROP FUNCTION IF EXISTS
并且CREATE OR REPLACE FUNCTION
正在锁定。我对吗?我可以通过将语句移到事务之外来解决问题。
我观察到以下情况:两个事务 A 和 B 包含一些DROP FUNCTION
and CREATE OR REPLACE FUNCTION
;如果我在事务 A 仍在运行时执行事务 B,则事务 B 会等待DROP FUNCTION
它遇到的第一条语句。
社区维基答案:
是的,其他交易当然会等待。(几乎)每个 DDL 语句都对正在修改(删除、创建)的对象进行独占锁定。请参阅文档中的显式锁定。