如何在 SQL Server 中禁用对表的锁定?

Vik*_*ova 0 sql t-sql sql-server locking transactions

我需要存储数据,其生命周期在大多数情况下应该是 1-30 分钟(但仍然可以是 1 天/1 周)。这只是一个特定的项目 - 由许多用户执行的大量批量操作。

因此,处理这些数据的典型过程:

  1. 用户上传一个文档,我们解析它并将数据推送到表中(插入 100-70000 行)
  2. 我们验证数据并向用户显示错误
  3. 用户更正数据(单次更正 - 更新 1 行)
  4. 用户运行一个操作,之后从表中删除所有上传的文档数据。

当只有单个用户使用系统时,这很好用。当许多用户上传产生大约 1-5 千行的文档时,这很有效。但是在插入 10,000 行后,SQL Server 会强制锁定表……这是一个问题。

所以,有不同的方法来解决这个问题,但它们都是丑陋的:

  1. 切换到键值存储 - 客户不同意使用其他存储
  2. 由于多种原因无法切换到内存解决方案
  3. 将插入组插入 2 千行并为每个指定不同的事务并手动处理失败 - 太丑了

我接下来要:关闭对指定表的任何锁定。不需要一致性,只有索引应该工作。

我怎么能做到这一点?任何其他想法也受到赞赏。

小智 5

您可以通过 ALTER TABLE mytable SET(LOCK_ESCALATION=DISABLE) 在表级别禁用锁升级。有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/ms190273.aspx

重要提示:锁升级是一种基本的资源治理方法。禁用它可能会导致显着更高的内存消耗,这反过来又会产生各种下游影响,因此在松开之前彻底测试。这是 32 位平台的一个主要问题,它将任何应用程序的 VAS 限制为 4GB,而不管服务器上安装了多少 RAM。以上任何内容仅可用于数据缓存。在 64 位平台上,SQL Server 能够将您拥有的任何内存用于任何目的。