ใน Postgres วิธีรับรายการ savepoint ที่กำหนดในปัจจุบันต้องทำอย่างไร?


13

ฉันใช้ postgres SAVEPOINTซึ่งสร้าง savepoint ใหม่ภายในธุรกรรมปัจจุบันและต้องการแสดงรายการของ savepoint ที่กำหนดไว้ในปัจจุบันในการเชื่อมต่อ

เพื่อให้แม่นยำยิ่งขึ้น: ฉันต้องการตรวจสอบชื่อที่จะไม่เรียกข้อผิดพลาด "no savepoint" ในการเชื่อมต่อ

คำตอบ:


8

คำถามที่น่าสนใจ! คำตอบสั้น ๆ : ไม่มี

คำตอบยาว: ไม่ปรากฏว่ามีวิธีใดที่มีอยู่ในการรับรายการของจุดบันทึกที่กำหนดไว้ ยิ่งแย่ไปกว่านั้นมันเป็นไปไม่ได้ที่จะสร้างส่วนขยาย PostgreSQL ซึ่งจะช่วยให้คุณทำสิ่งนี้: ดูที่src / แบ็กเอนด์ / เข้าถึง / transam / xact.cคุณสามารถเห็นฟังก์ชั่นเช่น RollbackToSavepoint (ซึ่งเป็นที่ที่ "ไม่เช่นนั้น ข้อผิดพลาด savepoint "คุณกล่าวถึงมาจาก) พึ่งพาตัวแปร CurrentTransactionState ซึ่งประกาศคงที่เพื่อ xact.c คือจะไม่สามารถมองเห็นได้ทั่วโลกเพื่อรหัสส่วนขยาย

ตอนนี้ถ้าคุณกล้าและอยากจะสร้างรายการของจุดบันทึกที่กำหนดไว้จากฝั่งเซิร์ฟเวอร์ (ตรงข้ามกับที่ลูกค้าของคุณจำได้ว่า ... ) คุณสามารถเพิ่มฟังก์ชั่นตัวช่วยลงใน xact.c ที่จะแสดงสิ่งนี้ ข้อมูลสำหรับคุณ ในความเป็นจริงนี่เป็นเพียงเช่นแพทช์ นั่นเป็นแพทช์คร่าวๆเพื่อจุดประสงค์ในการประกอบภาพเท่านั้นและเพียงแค่ elogs ชื่อ savepoint มันควรจะคืนชื่อเหล่านั้นเป็น setof text จริงๆ

ด้วยเหตุที่คุณสมบัตินี้หายไปฉันคาดว่าจะไม่มีกรณีการใช้งานที่เป็นไปได้สำหรับลูกค้าที่ต้องการดึงรายการของจุดบันทึกที่กำหนดจากเซิร์ฟเวอร์ ลูกค้าจะทำอะไรกับรายการนี้ - เพียงแค่เลือกอย่างสุ่มและROLLBACKมันได้หรือไม่ ROLLBACKเป็นคนสุดท้ายที่สุ่มสี่สุ่มห้า? AFAICT savepoints จะมีประโยชน์ก็ต่อเมื่อลูกค้าจำได้ว่ามีการกำหนด savepoint ไว้ในจุดใดและอยู่ที่ไหนเพื่อให้สามารถใช้ประโยชน์ได้


ขอบคุณสำหรับคำตอบนี้ ลูกค้าควรจำแน่นอน แต่ในกรณีที่การเข้าถึงแบบมัลติเธรดที่ซับซ้อนในการเชื่อมต่อเดียวนี้จะเป็นประโยชน์ในการแก้จุดบกพร่องรหัสลูกค้า! และข้อมูลเพิ่มเติมที่สามารถเข้าถึงได้มักจะดีกว่า IMHO น้อยกว่า
vaab

ใช่สำหรับการรันโค้ดมันไม่สมเหตุสมผล แต่สำหรับการแก้ไขข้อบกพร่องมันจะมีประโยชน์ในการดูว่าจุดบันทึกใดที่เปิดอยู่ ขอบคุณสำหรับคำตอบ.
guettli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.