【发布时间】: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