我正在测试连接丢失或超时时查询可能出现的问题。为了进行测试,我使用新连接运行查询,并在我终止程序或断开网络连接几秒钟后运行。然后我检查查询的影响。
我相信,如果一个查询,不在显式事务中,由于任何原因失败,将会回滚效果。当然,这对于 DELETE、INSERT、UPDATE 或 DDL 语句等操作也很有意义。数据库中的隐式事务处于关闭状态。
我的理论是正确的,除非我运行了 SELECT-INTO 语句。我尝试过的示例查询 -
SELECT * INTO test_table FROM audit
由于Socket读取超时而失败,但后来我发现即使没有插入记录,新表test_table
也被创建为空。
浏览文档一段时间后,根据 official documentation,这是预期的行为。这是可以理解的。但对我来说问题是我无法真正重试此查询执行,因为该表已存在。
我想要解决这个问题,我需要使用围绕此类语句的显式事务。
帮助我使用该功能 - 我的方法正确吗?是否还有其他 SQL 语句会导致类似行为?
提前致谢。
编辑: 既然我得到了如何解决这个问题的建议,我现在想知道是否还有其他 SQL 语句会导致类似的行为。