在 PostgreSQL 中提交事务会失​​败吗?

Tar*_*ion 4 testing postgresql transactions

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

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

Cra*_*ger 5

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

是的。

可能的原因是什么?

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

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

任何一个。例如,序列化失败肯定与查询运行有关。

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

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

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

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

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