2015-07-16 2 views
0

У меня есть следующий запрос в 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
SELECT EXISTS (SELECT 1 FROM s.t1 WHERE id2 = 22 and id3 = true FOR UPDATE); 
/* Does it take a lock on the row. */ 

Да. Все строки, полученные запросом, заблокированы. Не имеет значения, в какой форме и вообще ли они возвращаются запросом.

Если подзапрос блокирует некоторые строки, внешний запрос может уменьшить количество заблокированных строк (если он уменьшает количество восстановленных строк). В этом случае внешний запрос уменьшает количество заблокированных строк до одной строки.

Смежные вопросы