我正在尝试确定应用程序的交易是否失败。如何做到这一点?
此外,是否有可能确定事务失败的位置,例如违反约束的特定写入?
最佳答案
在常规 libpq
中,您将:
使用
测试查询结果PQresultStatus
PQresultErrorField(thePgResult, PG_DIAG_SQLSTATE)
获取SQLSTATE
使用
PQerrorMessage
获取错误消息以显示给用户。 不要依赖于在您的应用程序中对此进行解析,而是使用SQLSTATE
和结果结构中的其他字段。
参见 connection status functions , libpq exec functions以及 libpq
文档的其余部分。
相关:How to get the sql state from libpq?
我没有使用 libpqxx 的经验,但我希望它能将 SQL 错误包装到带有 SQLState 等字段的 C++ 异常中。参见 the getting started guide for libpqxx和 the libpqxx exception classes reference .
This mailing list post线程中的回复也很有趣,但请注意它是从 2007 年开始的,从那时起,PostgreSQL 已扩展为在 PQresult
中报告更多信息,例如 PG_DIAG_CONSTRAINT_NAME
。不知道 libpqxx 是否已被扩展以利用它,但如果没有,您可以解包异常以获得底层 PQresult
。
据我所知,除非向用户显示完整的错误消息,否则无法获得导致问题的实际值。如果能改变这一点就好了。
关于c++ - 应用程序如何确定回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21716356/