在截断SQL表时如何阻止用户

时间:2017-02-17 17:58:24

标签: sql-server sql-server-2008-r2 truncate

我们有一个SQL Server 2008R2表,用于跟踪递增的唯一键值,如事务编号等。它就像序列对象的错误版本。表中有大约300个这些独特的键。 我的问题是该表每天增加100,000行,因为它保留了以前使用的数字。 我的问题是我们必须每周清理一次表,否则性能会受到影响。我想使用截断,然后启动SP以为300个键中的每个键生成下一个递增值。这适用于大约5分钟的运行时间,但在此期间系统正在尝试使用该表并抛出错误,因为没有数据。 有没有办法锁定表,阻止用户访问,截断然后解锁?

2 个答案:

答案 0 :(得分:3)

TRUNCATE会自动锁定整个表格。 delete语句将实现行锁定,这不会干扰您的用户查询。您可能想要考虑在非工作时间清除旧记录。

答案 1 :(得分:1)

这需要读者的合作。如果要避免使用高度阻塞的隔离级别(如serializable),可以使用sp_getapplock和sp_releaseapplock在重新生成过程中保护表。 https://msdn.microsoft.com/en-us/library/ms189823.aspx

另一种方法可能是在另一个表中构建新集,然后使用sp_rename将它们交换出来。