блокирует любое чтение с другими SELECT FOR UPDATE, чтобы избежать lost update. Но тут я прочитал документацию:
UPDATE, DELETE, SELECT FOR UPDATE, and SELECT FOR SHARE commands behave the same as SELECT in terms of searching for target rows: they will only find target rows that were committed as of the command start time. However, such a target row might have already been updated (or deleted or locked) by another concurrent transaction by the time it is found.
https://www.postgresql.org/docs/12/transaction-iso.html
Я не смог понять текст на английском корректно или SELECT FOR UPDATE работает иначе?
https://postgrespro.ru/docs/postgresql/15/sql-select#SQL-FOR-UPDATE-SHARE
То есть, если использовать SELECT * FROM SomeTable FOR UPDATE WHERE x = 10; то пока идет транзакция после выполнения данной строки, другие SELECT вообще не смогут получить доступ к этой строке?
Не "другие SELECT", а "другие SELECT FOR UPDATE". Ну и всякие другие операции, требующие блокировку, конфликтующую с данной. (во завернул!)
Понял, спасибо большое!
SELECT FOR UPADTE == UPDATE. оно не может заблокировать SELECT-ы. Но заблокирует UPDATE-ы и все более тяжелые, см. Таблица 13.2 в документации
Обсуждают сегодня