postgresql postgres“SELECT FOR UPDATE”是否限制创建新的外键引用?

klsxnrf1  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(224)

有两个表,一个被另一个带有外键约束的表引用。

CREATE TABLE record
(
  id                    UUID PRIMARY KEY  NOT NULL
);    

CREATE TABLE task
(
  id                    UUID PRIMARY KEY  NOT NULL,
  record_id       UUID,
  CONSTRAINT fk_task_record_id FOREIGN KEY (record_id) 
  REFERENCES record (id)
);

问题是:如果record行上锁定被

SELECT * FROM record where id = 'A' FOR UPDATE OF record

我可以在task表中创建新的外键并引用record行吗?

INSERT INTO task VALUES ('someId', 'A');

Postgres是否会阻止在被SELECT FOR UPDATE OF锁定的表上创建新的外键引用?

xmq68pz9

xmq68pz91#

不,不是的。
select .. for update只阻止对该行的 * 更改 *(更新、删除)。
它不会阻止其他事务 * 阅读 * 该行,这是插入一行 * 引用 * 锁定行所需的。

bgibtngc

bgibtngc2#

是的,是的。
在2个不同的终端中连接到postgres数据库,并在终端1中运行以下查询-

BEGIN;
SELECT * FROM record where id = 'A' FOR UPDATE OF record;

在2号航站楼,运行-

INSERT INTO task VALUES ('someId', 'A');

再次在1号航站楼,运行-

COMMIT;

您会注意到终端2中的查询直到您在终端1中提交后才返回。这是因为for update关键字使查询甚至等待使用外键引用它的表。

相关问题