我在SQL Server 2005和2008数据库中有一个表,它有一个截断表的定期作业和另一个具有从末尾删除行的定期作业的表。我的问题是,如果我在截断或删除作业开始之前已经启动了select,那么select会查询pre truncate / delete数据,还是可以在select读取之前删除某些数据?选择将使用一个表或另一个不加入两个表。
这些陈述将遵循这些方针:
select * from someTable where id > x and id < y
truncate table someTable
delete from otherTable where id < z
答案 0 :(得分:3)
Truncate将等待SELECT完成。 DELETE不会。 DELETE可以在SELECT有机会读取行之前删除行。这是否真的会发生取决于更多因素,例如表组织(索引,聚簇索引)和基数(表中的行数,低位和高位之间的行数,低于高位的行数)。
您可以通过部署row versioning
来防止这种情况发生