有两个表,一个被另一个带有外键约束的表引用。
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
锁定的表上创建新的外键引用?
2条答案
按热度按时间xmq68pz91#
不,不是的。
select .. for update
只阻止对该行的 * 更改 *(更新、删除)。它不会阻止其他事务 * 阅读 * 该行,这是插入一行 * 引用 * 锁定行所需的。
bgibtngc2#
是的,是的。
在2个不同的终端中连接到postgres数据库,并在终端1中运行以下查询-
在2号航站楼,运行-
再次在1号航站楼,运行-
您会注意到终端2中的查询直到您在终端1中提交后才返回。这是因为for update关键字使查询甚至等待使用外键引用它的表。