为了从 PostgreSQL 中检索域模型数据,我有时会选择视图而不是表。我这样做是为了在一个查询中返回尽可能多的信息,而不是触发多个查询来解决所有关系依赖项。这主要是因为表之间存在一对一的关系,或者它们是查找表,我只需要某些列等。为了防止某些竞争条件,我使用的一种策略是SELECT ... FOR SHARE/UPDATE
查询。我想知道当我们开始对视图使用它们时它们的行为如何。
假设我们有两个表A
和B
,每个表都有一列ID
。现在,假设我们有一个视图AB
,它是这两个表之间的连接操作。假设这是一个笛卡尔连接:
SELECT
"A"."ID" AS "AID",
"B"."ID" AS "BID"
FROM "A"
CROSS JOIN "B"
如果我们在以下情况下SELECT FOR UPDATE
针对AB
哪些表的哪些行会被锁定?
SELECT * FROM "AB" WHERE "AB"."AID" = :ID
SELECT * FROM "AB" WHERE "AB"."BID" = :ID
SELECT * FROM "AB" WHERE "AB"."AID" = :ID1 AND "AB"."BID" = :ID2
简短的回答
在三种情况下,以下行将被锁定以进行更新:
阅读文档中的此声明后,结果与预期的一样:
如何测试类似的案例
安装扩展pgrowlocks。.
运行两个 psql 实例。在第一个中启动事务并执行查询。
psql #1:
您可以在 psql 的另一个实例中看到锁定的行。
psql #2:
不要忘记在最后关闭事务(在下一次测试之前)。
psql #1:
上述结果的第一列是
ctid
。您可以使用查询选择原始行: