Database 使用行锁更新
我在postgres中有以下查询Database 使用行锁更新,database,postgresql,sql-update,locking,Database,Postgresql,Sql Update,Locking,我在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);
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;
我知道第二个查询(在事务下运行时)在特定行上使用锁。没有其他查询将能够访问
直到事务提交为止
在事务下运行时,第一个查询是否也会锁定行
谢谢
对。查询检索到的所有行都被锁定。查询以何种形式返回以及是否返回它们并不重要
如果子查询锁定某些行,则外部查询可能会减少锁定的行数(如果它减少检索到的行数)。在这种情况下,外部查询将锁定的行数减少为一行
SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22 and id3 = true FOR UPDATE);
/* Does it take a lock on the row. */