c++ - 应用程序如何确定回滚?

标签 c++ postgresql transactions rollback libpqxx

我正在尝试确定应用程序的交易是否失败。如何做到这一点?

此外,是否有可能确定事务失败的位置,例如违反约束的特定写入?

最佳答案

在常规 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 libpqxxthe 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/

相关文章:

sql - AWS Redshift 可以删除包含在事务中的表吗?

c++ - 在 C++ 中指示船只在游戏中被击落

c++ - QDialog 返回值,仅接受或拒绝?

postgresql - Julia 0.6 到 Postgres 的连接 - 可用选项和 LibPq.jl

php - 两个数据库上的两个事务

postgresql - 我可以包装 session 以创建光滑的交易吗?

C++陷入相等运算符分配的无限循环

c++ - 像这样使用 delete[] 会导致内存泄漏吗?

PostgreSQL - 必须出现在 GROUP BY 子句中或用于聚合函数中

sql - 使用给定的列和数据创建一个临时表