Я рассматриваю возможность использования "SELECT... FOR UPDATE" для выполнения некоторых изменений в нескольких строках. Например -
Select * from my_table where parent_id = 5
Update my_table set created = null where parent_id = 5;
Насколько я понимаю, он будет блокировать любой запрос на удаление/обновление строк, где parent_id=5. Меня беспокоит, что произойдет, когда в то же время будет запрос на создание новой строки my_table с parent_id=5. Заблокируют или нет?
Блокировки строк устанавливаются во время вызова SELECT ... FOR UPDATE
, поэтому вставка новых строк не будет заблокирована, даже если они соответствуют критериям выбора для заблокированных строк. Это можно легко подтвердить, запустив транзакцию и выполнив SELECT ... FOR UPDATE
, затем во втором сеансе вставьте новую строку, соответствующую критериям выбора, и выполните обновление для вновь вставленной строки. Обе операции завершатся. Убедитесь, что первоначально выбранные строки по-прежнему заблокированы, попытавшись обновить одну из них во втором сеансе. Операция будет зависать до тех пор, пока транзакция в первом сеансе не будет завершена.