У меня есть ряд операторов SQL, которые выглядят следующим образом:
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
Я хотел бы запретить считывание счетчика, пока я пересчитываю его значение, но, согласно документам Postgres, «блокировки на уровне строк не влияют на запросы данных; они блокируют только записи в одну и ту же строку».
Вопросов:
- Какой смысл "исключительной" блокировки строк, если она не предотвращает чтение? Только для того, чтобы другие транзакции не блокировали акции?
- Если я прочитаю строку с помощью SELECT ... FOR SHARE, то достигнет ли это того же эффекта, что и «исключительная» блокировка?
- Можно ли отключить MVCC для таблицы / схемы / базы данных и разрешить запись на место?
источник