我正在开发启动多个并发客户端以连接到 PostgreSQL (12) 数据库的软件。当每个客户端启动时,它在连接到 PostgreSQL 时做的第一件事就是运行模式创建脚本。
这个脚本是幂等的——至少在原则上——这样多个客户端不应该绊倒自己。总的来说,这很好用。但是,PostgreSQL 有时会检测到死锁和受影响的客户端崩溃。查看日志记录,我相信这些是按照这样的顺序发生的:
- 客户端 A:开始架构创建事务
- 客户端 A:完成模式创建事务
- 客户端 B:开始架构创建事务
- 客户端 A:使用模式的新事务(从视图中选择)
- 客户端 A 和 B 现在处于死锁状态
日志不是 100% 清晰的,我无法确定地重现这一点,但这似乎是正在发生的事情:客户端 A 正在尝试SELECT
从架构定义的视图中进行操作,但由于客户端 B 正在尝试重新创建该视图,因此出现了死锁模式脚本中的视图 ( CREATE OR REPLACE VIEW
)。
是否可以确保模式创建脚本独占运行?或者,是否有其他解决方案(例如,而不是CREATE OR REPLACE VIEW
,我只有CREATE VIEW
在我确定它不存在之后)?