【问题标题】:Can committing an transaction in PostgreSQL fail?在 PostgreSQL 中提交事务会失​​败吗?
【发布时间】:2016-02-13 22:48:15
【问题描述】:

如果我在事务中成功执行了一些 SQL,是否会发生提交失败?可能的原因是什么?它是否会因执行的查询而失败,或者仅仅是由于一些数据库方面的问题?

问题出现是因为我需要判断在测试中提交事务是否有意义,或者是否“足够安全”可以在每个测试用例之后回滚。

【问题讨论】:

  • 是的,事务可能在提交时失败,例如:使用了可延迟的约束。
  • 或者如果您在提交期间耗尽了资源,或者如果服务器出现故障,或者其他什么。处理这个问题的正确方法是使用 2 Phase Commits。您准备好提交,一旦准备好,您甚至可以在服务器重新启动后提交事务 - 所有数据仍然存在。
  • 我关心应用程序问题。因此,如果服务器出现故障或资源不足,那当然是个问题,但我不想测试。我更关心导致提交失败的基于应用程序的问题。

标签: postgresql testing transactions


【解决方案1】:

如果我在事务中成功执行了一些 SQL,会不会发生提交失败?

是的。

什么是可能的原因?

  • DEFERRABLE 约束与 SET CONSTRAINTS DEFERRED 或在单语句自动提交事务中。 (除非您使用 DEFERRABLE 约束,否则不会发生)
  • SERIALIZABLE 在提交时检测到序列化失败的事务。 (除非您使用 SERIALIZABLE 交易,否则不会发生)
  • 数据库崩溃或关闭的异步提交。 (如果synchronous_commit = on 则不会发生,默认)
  • 磁盘 I/O 错误、文件系统错误等
  • 内存不足错误
  • 在您发送commit 之后但在您确认成功之前导致会话断开的网络错误。在这种情况下,您不确定它是否已提交。
  • ...可能更多

它是否会因执行的查询而失败,或者仅仅是由于一些数据库方面的问题?

要么。例如,序列化失败肯定与查询运行有关。

如果您使用没有延迟约束的READ COMMITTED 隔离,那么提交可能只会由于底层系统错误而失败。

问题出现是因为我需要判断在测试中提交事务是否有意义,或者是否“足够安全”可以在每个测试用例之后回滚。

任何明智的测试套件都必须涵盖多个并发事务交互、以不同顺序提交等。

如果您测试的只是单个独立事务,则您不是在测试真实系统。

所以问题是 IMO 没有实际意义,因为无论如何都必须提交一套体面的测试。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2020-06-23
    • 2018-12-13
    • 2017-11-18
    • 2023-03-11
    • 2019-10-09
    • 2013-04-23
    • 2013-04-11
    • 2013-02-22
    相关资源
    最近更新 更多