我在postgres中有以下查询。
CREATE SCHEMA s;
CREATE TABLE s.t1 (
"id1" Bigint,
"id2" Bigint,
"id3" Boolean DEFAULT false NOT NULL,
CONSTRAINT "pk1" PRIMARY KEY (id1)
)
WITH(OIDS=FALSE);
INSERT INTO s.t1 (id1, id2, id3) VALUES (1, 22, true);
INSERT INTO s.t1 (id1, id2) VALUES (2, 22);
INSERT INTO s.t1 (id1, id2) VALUES (3, 33);
SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22 and id3 = true FOR UPDATE); /* Does it take a lock on the row. */
SELECT id3 FROM s.t1 WHERE id2 = 22 and id3 = true FOR UPDATE; /* Takes a lock on the row. */
DROP SCHEMA s CASCADE; 我了解到,第二个查询在特定的行上使用一个锁(在事务下运行时)。在事务提交之前,任何其他查询都无法访问该行。
在事务下运行时,第一个查询是否也会对行进行锁定?
谢谢
发布于 2015-07-16 22:35:10
SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22 and id3 = true FOR UPDATE);
/* Does it take a lock on the row. */是。查询检索的所有行都被锁定。无论以何种形式存在,以及查询是否返回它们都不重要。
如果子查询锁定了一些行,则外部查询可能会减少已锁定的行数(如果减少检索到的行数)。在这种情况下,外部查询将锁定的行数减少到一行。
https://stackoverflow.com/questions/31465235
复制相似问题