【问题标题】:How can I block users while I truncate a SQL Table如何在截断 SQL 表时阻止用户
【发布时间】:2017-02-17 17:58:23
【问题描述】:

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

【问题讨论】:

  • 您是在问“我如何从数据库中踢出用户”?
  • 您是否可以在不同的表中执行您的过程,然后,一旦完成,将旧表重命名为其他名称,将新表重命名为“活动”表?如果是这样,那是瞬间的(你会暂时阻塞,但远不及现在的 5 分钟)。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 2017-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      相关资源
      最近更新 更多