* FROM "tasks" WHERE "id" = 2632966 FOR UPDATE
2) без, запускается после первого
SELECT * FROM "tasks" WHERE "id" = 2632966;
я ожидаю то что второй запрос не получит доступ на чтедние, так как строка залочена for update, но по факту я получаю результат
если же я добавляю FOR UPDATE для второго запроса, то все работает как я ожидаю, пока не закроется транзация первого запроса, запрос будет висеть.
Правильно ли я пониамаю, если я хочу залочить селект для запроса без транзации, для конкретной записи, я могу прописать for update, при условвии что запись уже залочена FOR UPDATE другим запросом с транзацией? хорошая ли это практика?
И да доступ на чтение нет) в рамках for update
расставил, но повторю еще раз конкретнее: ``` BEGIN; SELECT * FROM "tasks" WHERE "id" = 111 FOR UPDATE; -- запрос вне транзации: SELECT * FROM "tasks" WHERE "id" = 111 for KEY SHARE ; COMMIT; ``` получаю то что ожидаю: пока не произойдет комит, второй селект не выполнится ``` BEGIN; SELECT * FROM "tasks" WHERE "id" = 111 FOR UPDATE; -- запрос вне транзации: SELECT * FROM "tasks" WHERE "id" = 111; COMMIT; ``` второй селект получает доступ на чтение до коммита транзакции
Да все правильно. Второй вариант не запрашивает блокировок и ни чего не знает о «соседних транзакциях»
Обсуждают сегодня