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.