【问题标题】:When a SQL DELETE query times out, what happens with the data?当 SQL DELETE 查询超时时,数据会发生什么情况?
【发布时间】:2016-12-25 17:33:41
【问题描述】:

如果我要运行 DELETE FROM some_table,然后超时,数据会怎样?

在我看来,可能会发生以下两种情况之一:

  • 数据被删除直到查询超时,所以如果数据库中有 1,000,000 个条目并且前 500,000 个被删除,它们将保持被删除状态。数据库现在包含的数量是查询运行前的一半。

  • 数据被删除,查询超时,数据被回滚(我从DELETE的日志猜到了?)。数据库现在包含与开始时完全相同的数据。

两者似乎都是合乎逻辑的。会发生 100% 的时间吗?还是这取决于我不知道的某些设置?请注意,我不是在问DELETE 的可行性,我意识到TRUNCATE 可能是合适的。这纯粹是出于对DELETE 的超时功能的好奇。

【问题讨论】:

  • mysql 是一个 ACID 数据库。单个查询语句是原子的——它们要么完全完成,要么根本不做任何事情。
  • @Marc:严格来说,这取决于所使用的引擎。
  • timeout 表示事务中止时,DELETE 将回滚。
  • 如果您的问题专门针对 SQL Server,请不要使用 MySQL 标记它。
  • 究竟发生了什么还取决于谁超时。如果客户端超时,但服务器没有意识到它,您可以有一个孤立的未提交删除事务,该事务会保留一段时间。根据您的数据库的配置方式,这可能会导致其他会话无法读取或写入表的数据,直到服务器意识到它需要回滚该操作。

标签: sql sql-server database


【解决方案1】:

Oracle、SQL Server、MySQL、PostgreSQL 数据库遵循 ACID 属性。因此,只要 delete 语句显示超时,它就必须回滚。 您可以从Link 获得 ACID 的概述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多