更新行锁定

时间:2015-07-16 21:58:31

标签: 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);
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; 

我理解第二个查询在特定行上获取锁定(在事务下运行时)。没有其他查询将能够访问 直到交易提交为止。

在事务下运行时,第一个查询是否也对该行进行了锁定?

由于

1 个答案:

答案 0 :(得分:1)

SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22  and id3 = true FOR UPDATE);
/* Does it take a lock on the row. */

是。查询检索的所有行都被锁定。它与查询返回的形式无关紧要。

如果子查询锁定某些行,则外部查询可能会减少锁定行的数量(如果它减少了检索行的数量)。在这种情况下,外部查询将锁定的行数减少到一行。