* 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; ``` второй селект получает доступ на чтение до коммита транзакции
Да все правильно. Второй вариант не запрашивает блокировок и ни чего не знает о «соседних транзакциях»
Обсуждают сегодня