В Postgres, как получить список текущей определенной точки сохранения?


13

Я использую postgres SAVEPOINT, который создает новую точку сохранения в текущей транзакции, и хотел бы отобразить список определенных в настоящий момент точек сохранения в соединении.

Чтобы быть более точным: я хотел бы проверить, какое имя НЕ будет вызывать ошибку «нет такой точки сохранения» в соединении.

Ответы:


8

Интересный вопрос! Краткий ответ: нет .

Длинный ответ: кажется, что не существует никакого существующего способа получить список определенных точек сохранения. Хуже того, кажется невозможным создать расширение PostgreSQL, которое позволило бы вам сделать это: глядя на src / backend / access / transam / xact.c , вы можете увидеть, что такие функции, как RollbackToSavepoint (где это «нет такого»). сообщение об ошибке «точка сохранения», о котором вы упомянули, полагается на переменную CurrentTransactionState, которая объявлена ​​статической для xact.c, т.е. не будет видна глобально для кода расширения.

Теперь, если вы осмеливались и отчаянно пытались сгенерировать список определенных точек сохранения со стороны сервера (в отличие от простого запоминания вашего клиента ...), вы могли бы добавить вспомогательную функцию в xact.c, которая бы отображала это информация для вас. На самом деле вот такой вот патч . Это очень грубое исправление только для иллюстративных целей, и оно просто выдает имена точек сохранения, оно действительно должно возвращать эти имена в виде набора текста.

Относительно того, почему эта функция отсутствует, я предполагаю, что просто нет правдоподобного варианта использования для клиента, нуждающегося в получении списка определенных точек сохранения с сервера. Что бы клиент сделал с этим списком - просто выберите один наугад и ROLLBACKк нему? ROLLBACKдо последнего слепо? Точки сохранения AFAICT полезны только в том случае, если клиент запоминает, какие точки сохранения он определил и где они были, чтобы иметь возможность использовать их.


Спасибо за этот ответ. Конечно, клиент должен помнить, но в случае сложного многопоточного доступа к одному соединению это будет полезно для отладки клиентского кода! И больше информации, возможно доступной, часто лучше, чем меньше ИМХО.
— Вааб

Да, для запуска кода это не имеет смысла. Но для отладки было бы полезно посмотреть, какие точки сохранения открыты. Спасибо за ваш ответ.
— Геттли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.