W Postgres, jak uzyskać listę aktualnie zdefiniowanych punktów zapisu?

13

Używam postgres SAVEPOINT, który tworzy nowy punkt zapisu w ramach bieżącej transakcji i chciałbym wyświetlić listę aktualnie zdefiniowanych punktów zapisu w połączeniu.

Mówiąc ściślej: chciałbym sprawdzić, która nazwa NIE wyzwala błędu „brak takiego punktu zapisu” w połączeniu.

Vaab
źródło

Odpowiedzi:

8

Interesujące pytanie! Krótka odpowiedź: nie .

Długa odpowiedź: wydaje się, że nie istnieje żaden sposób na zdefiniowanie listy punktów zapisu. Co gorsza, nie wydaje się możliwe utworzenie rozszerzenia PostgreSQL, które pozwoliłoby ci to zrobić: patrząc na src / backend / access / transam / xact.c , możesz zobaczyć, że funkcje takie jak RollbackToSavepoint (gdzie nie ma takiego „takiego” savepoint "komunikat o błędzie, o którym wspomniałeś, pochodzi) opiera się na zmiennej CurrentTransactionState, która jest zadeklarowana jako statyczna dla xact.c, tzn. nie byłaby widoczna globalnie dla kodu rozszerzenia.

Teraz, jeśli odważyłeś się i dość desperacko wygenerowałeś listę zdefiniowanych punktów zapisu po stronie serwera (w przeciwieństwie do tego, żeby twój klient pamiętał ...), możesz dodać funkcję pomocniczą do xact.c, która wyświetlałaby to informacje dla ciebie. W rzeczywistości tutaj jest właśnie taka łatka . Jest to bardzo szorstka łatka wyłącznie w celach ilustracyjnych i po prostu wymienia nazwy punktów zapisu, naprawdę powinna zwracać te nazwy jako zbiór tekstu.

Jeśli chodzi o to, dlaczego brakuje tej funkcji, przypuszczam, że po prostu nie ma wiarygodnego przypadku użycia dla klienta, który musiałby pobrać listę zdefiniowanych punktów zapisu z serwera. Co zrobiłby klient z tą listą - wystarczy wybrać jedną losowo i ROLLBACKdo niej? ROLLBACKdo ostatniego na ślepo? Punkty zapisu AFAICT są użyteczne tylko wtedy, gdy klient pamięta zdefiniowane przez siebie punkty zapisu i gdzie były, aby móc z nich skorzystać.

Josh Kupershmidt
źródło
Dziękuję za tę odpowiedź. Klient powinien oczywiście pamiętać, ale w przypadku skomplikowanego wielowątkowego dostępu do jednego połączenia pomocne byłoby debugowanie kodu klienta! Więcej dostępnych informacji jest często lepszych niż mniej IMHO.
vaab
Tak, uruchamianie kodu nie ma sensu. Ale do debugowania pomocne byłoby sprawdzenie, które punkty zapisu są otwarte. Dziękuję za Twoją odpowiedź.
guettli