Я новичок в postgresql. Я просмотрел документацию и ничего не могу найти о том, как выполнить блокировку на уровне страницы.
Я понимаю, что могу установить для таблицы режим блокировки следующим образом: LOCK TABLE myTable IN LOCKMODE ROW EXCLUSIVE;
Как мне реализовать блокировку на уровне страницы для моего сеанса? Дайте мне знать, если мне покажется, что я неправильно понимаю основы.
Почему ты хотеть сделать явную блокировку на уровне страницы? Вы не контролируете, что находится на каждой странице, поэтому вы заблокируете произвольный набор данных. Какой цели это послужит?
Я думаю ты ищешь блокировка на уровне строк, что достигается с помощью SELECT ... FOR UPDATE
или SELECT ... FOR SHARE
.
PostgreSQL модернизирует блокировки на уровне строк до блокировок на уровне страниц внутри в нескольких местах, таких как отслеживание предикатов сериализуемых снимков, управление буфером и т. Д. Он будет делать это, когда блокировок на уровне строк слишком много и они становятся проблемой производительности. Вам не нужно об этом заботиться, так как это практически не повлияет на вас на уровне SQL. Нормальные блокировки строк - полученные от UPDATE
, DELETE
, SELECT ... FOR UPDATE
, SELECT ... FOR SHARE
и т.д. - AFAIK никогда не обновляется до блокировок на уровне страницы, так как это увеличивает вероятность взаимоблокировок.
Если вы действительно убеждены, что вам нужна блокировка на уровне страниц, более подробно объясните, какую проблему вы пытаетесь решить и почему блокировка на уровне строк или таблиц не работает.
Видеть:
SELECT ... FOR [UPDATE|SHARE]
- блокировка на уровне строкLOCK
- блокировка на уровне стола