Trong Postgres, làm thế nào để có được danh sách các điểm lưu trữ được xác định hiện tại?


13

Tôi đang sử dụng postgres SAVEPOINT để tạo một điểm lưu trữ mới trong giao dịch hiện tại và muốn hiển thị danh sách các điểm lưu trữ được xác định hiện tại trong một kết nối.

Nói chính xác hơn: Tôi muốn kiểm tra tên nào sẽ KHÔNG gây ra lỗi "không có điểm lưu trữ như vậy" trong một kết nối.

Câu trả lời:


8

Câu hỏi thú vị! Câu trả lời ngắn: không .

Câu trả lời dài: dường như không có bất kỳ cách nào hiện có để có được một danh sách các điểm lưu trữ được xác định. Thậm chí tệ hơn, dường như không thể tạo tiện ích mở rộng PostgreSQL cho phép bạn làm điều này: nhìn vào src / backend / access / transam / xact.c , bạn có thể thấy các chức năng như RollbackToSavepoint (đó là nơi "không như vậy thông báo lỗi lưu trữ "mà bạn đã đề cập đến từ) dựa vào biến CurrentTransactionState, được khai báo là tĩnh đối với xact.c, tức là sẽ không hiển thị trên toàn cầu đối với mã mở rộng.

Bây giờ, nếu bạn táo bạo và khá tuyệt vọng khi tạo một danh sách các điểm lưu trữ được xác định từ phía máy chủ (trái ngược với việc khách hàng của bạn nhớ ...), bạn có thể thêm chức năng trợ giúp vào xact.c sẽ hiển thị điều này thông tin cho bạn Trong thực tế, đây chỉ là một bản vá . Đó là một bản vá rất thô chỉ dành cho mục đích minh họa và chỉ cần bỏ qua các tên của điểm lưu trữ, nó thực sự nên trả lại các tên đó dưới dạng văn bản setof.

Về lý do tại sao tính năng này bị thiếu, tôi phỏng đoán rằng đơn giản là không có trường hợp sử dụng hợp lý nào cho một khách hàng cần tìm nạp danh sách các điểm lưu trữ được xác định từ máy chủ. Khách hàng sẽ làm gì với danh sách này - chỉ cần chọn một cách ngẫu nhiên và ROLLBACKvới nó? ROLLBACKđến người cuối cùng một cách mù quáng? Điểm lưu trữ AFAICT chỉ hữu ích nếu khách hàng nhớ những điểm lưu trữ đã xác định và vị trí của chúng để có thể sử dụng chúng.


Cảm ơn câu trả lời này. Tất nhiên, khách hàng nên nhớ, nhưng trong trường hợp truy cập đa luồng phức tạp vào một kết nối, điều này sẽ hữu ích để gỡ lỗi mã máy khách! Và nhiều thông tin có thể truy cập thường tốt hơn ít IMHO.
vaab

Vâng, đối với việc chạy mã, nó không có ý nghĩa. Nhưng để gỡ lỗi, sẽ rất hữu ích khi xem điểm lưu trữ nào đang mở. Cảm ơn về câu trả lời của bạn.
guettli
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.