在Postgres中,如何获取当前定义的保存点的列表?


13

我正在使用postgres SAVEPOINT,它在当前事务中创建一个新的保存点,并希望在连接中显示当前定义的保存点的列表。

更准确地说:我想检查哪个名称不会触发连接中的“无此类保存点”错误。

Answers:


8

有趣的问题!简短的回答:

长答案:似乎没有任何现有方法可以获取定义的保存点列表。更糟糕的是,似乎无法创建允许您执行此操作的PostgreSQL扩展:查看src / backend / access / transam / xact.c,您可以看到类似RollbackToSavepoint的功能(在该功能中“保存消息”(您提到的错误消息来自)依赖于变量CurrentTransactionState,该变量对xact.c声明为静态,即,扩展代码不会在全局上看到它。

现在,如果您敢于并且非常渴望从服务器端生成已定义的保存点的列表(而不是仅仅让您的客户端记住...),则可以在xact.c中添加一个辅助函数,以显示此内容。给您的信息。实际上,这里就是这样的补丁。这是一个非常粗糙的补丁,仅用于说明目的,并且仅记录保存点名称,它实际上应该将这些名称作为setof文本返回。

至于为什么缺少此功能,我想对于需要从服务器获取定义的保存点列表的客户端来说,根本就没有合理的用例。客户将如何处理此列表-只需随机选择一个ROLLBACK即可?ROLLBACK到最后一个盲目?AFAICT保存点仅在客户记住其定义的保存点以及可以使用这些保存点的位置时才有用。


感谢您的回答。客户端当然应该记住,但是在对一个连接进行复杂的多线程访问的情况下,这将有助于调试客户端代码!而且,可能可获得的更多信息通常比少恕我直言更好。
vaab 2014年

是的,对于运行代码,这没有任何意义。但是对于调试,查看哪些保存点已打开将很有帮助。谢谢您的回答。
guettli
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.