Да и Не - както обикновено, зависи. Документацията стриктно казва, че:
С други думи, просто SELECT се различава от SELECT FOR UPDATE/DELETE/UPDATE.
Можете да създадете прост тестов случай, за да наблюдавате това поведение:
Сесия 1силен>
test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
x
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
test=> DELETE FROM test;
DELETE 10
test=>
Сега влезте в друга сесия 2:
test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
x
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;
След последната команда SELECT ... FOR UPDATE
сесия 1 "виси" и чака нещо ......
Обратно в сесия 1
test=> insert into test select * from generate_series(1,10);
INSERT 0 10
test=> commit;
COMMIT
И сега, когато се върнете към сесия 2, ще видите това:
test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;
x
---
(0 rows)
test=> select * from test;
x
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
Тоест - просто SELECT
все още не вижда никакви промени, докато SELECT ... FOR UPDATE
вижда, че редовете са изтрити. Но не вижда нови редове, вмъкнати от сесия 1
Всъщност последователност, която виждате е:
- процес А започва своята транзакция
- процес A изтрива всичко от таблица T
- процес Б започва своята транзакция
- процес B прави опит за избор за актуализиране на един ред в таблица T
- процес Б "зависва" и чака докато сесия А извърши ангажимент или връщане назад
- процес A попълва повторно таблица T от входящи данни
- процес А извършва транзакцията си
- процес B излиза празен (0 реда – след ангажимент на сесия A) и извиква връщане назад