Postgres:
Вопрос в том, будет ли эксклюзивно заблокирована строка из post на время выполнения всех этих операций
Собственно, да, всегда берется FOR UPDATE row-level lock, когда на строку делают delete, reference не влияет на это.
Посмотреть на локи можно примерно так.
Из одной консольки psql делаем
BEGIN;
delete from post where id = 1;
- в одной транзакции делаем delete ( понимаем, что он хватает лок на все, что удаляет )
Из другой консольки
BEGIN;
select * from post where id = 1 for update;
- эта транзакция пытается схватить лок на ту же строку, не может и ждет.
А вот что произойдет при роллбеке/коммите - это зависит от уровня изоляции транзакций.