可以在PostgreSQL中提交事务失败吗?

时间:2015-11-12 14:56:53

标签: postgresql testing transactions

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

问题出现了,因为我需要判断在测试中提交事务是否合理,或者它是否足够安全"在每个测试用例之后回滚。

1 个答案:

答案 0 :(得分:0)

  

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

  

可能的原因是什么?

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

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

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

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

  

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

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

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

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