Postgres에서 현재 정의 된 세이브 포인트 목록을 얻는 방법은 무엇입니까?


13

현재 트랜잭션 내에 새 저장 점을 생성하는 postgres SAVEPOINT 를 사용하고 있으며 현재 정의 된 저장 점 목록을 연결에 표시하려고합니다.

더 정확하게 말하면, 어떤 이름이 연결에서 "그런 세이브 포인트 없음"오류를 유발하지 않는지 확인하고 싶습니다.

답변:


8

재미있는 질문! 짧은 대답 : 아니오 .

긴 대답 : 세이브 포인트 목록을 정의하는 기존 방법이없는 것 같습니다. 더 나쁜 것은 PostgreSQL 확장을 만드는 것이 불가능한 것 같습니다. src / backend / access / transam / xact.c 를 보면 RollbackToSavepoint와 같은 기능을 볼 수 있습니다. 언급 한 savepoint "오류 메시지는 xact.c에 정적으로 선언 된 변수 CurrentTransactionState에 의존합니다. 즉, 전역 적으로 확장 코드에 표시되지 않습니다.

이제 서버 측에서 정의 된 저장 점 목록을 생성하기 위해 대담하고 필사적 인 경우 (클라이언트가 기억하는 것과는 대조적으로 ...) xact.c에 도우미 함수를 추가하여 이것을 표시 할 수 있습니다 당신을위한 정보. 실제로 여기에 그러한 패치가 있습니다. 이는 설명을위한 매우 거친 패치이며 저장 점 이름을 전자 메일로 보내면 해당 이름을 텍스트 집합으로 반환해야합니다.

이 기능이 누락 된 이유에 대해서는 서버에서 정의 된 저장 점 목록을 가져와야하는 클라이언트에 대한 사용 사례가 없다고 가정합니다. 고객이이 목록으로 ROLLBACK무엇을합니까? 무작위로 하나만 선택 하면 되나요? ROLLBACK마지막으로 맹목적으로? AFAICT 저장 점은 클라이언트가 정의한 저장 점과 저장 점을 사용하기 위해 저장 한 위치를 클라이언트가 기억하는 경우에만 유용합니다.


이 답변에 감사드립니다. 클라이언트는 물론 기억해야하지만 하나의 연결에 대한 복잡한 다중 스레드 액세스의 경우 클라이언트 코드를 디버그하는 데 도움이됩니다! 더 많은 정보에 접근 할 수있는 것이 IMHO보다 적을 때가 많습니다.
— vaab

예, 코드를 실행하는 것은 의미가 없습니다. 그러나 디버깅을 위해 열려있는 저장 점을 확인하면 도움이됩니다. 답변 주셔서 감사합니다.
— guettli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.