【问题标题】:SQL Server Large Transaction locking all tablesSQL Server 大型事务锁定所有表
【发布时间】:2016-12-08 17:21:01
【问题描述】:

感谢您花时间阅读我的问题。我们已经使用 T-SQL 构建了一个系统来处理(大量)数据。当我们开始处理这些数据时,这个操作通常需要大约 15 分钟才能完成。在此期间,由于某种原因,似乎数据库中的所有对象都被锁定了。在某种程度上,我知道我无法查询正在写入的表。但是,当我刷新表列表时(例如,在对象资源管理器的表节点上使用 F5),SQL Server 也会给我一个超时锁定消息。

我的代码基于以下模板工作:

CREATE PROCEDURE Sample

as

SET NOCOUNT, XACT_ABORT ON

BEGIN TRY

BEGIN TRANSACTION

...

COMMIT TRANSACTION

END TRY

BEGIN CATCH
    BEGIN
        PRINT 'STORED PROCEDURE - Returned errors while processing'
        ROLLBACK TRANSACTION
    END
END CATCH

现在,当我开始执行此操作时,我可以对任何表执行 SELECT WITH (NOLOCK) 查询。但我无法查看视图、存储过程的定义或基本上无法在数据库中执行任何其他类型的操作。

我已经设置了 READ UNCOMMITTED 隔离级别设置,但这似乎没有什么区别。

感谢您对此事的任何帮助。

亲切的问候,

【问题讨论】:

  • 隔离级别会影响 select 语句的工作方式,不会影响 DDL、DML.. 锁定、阻塞是大话题,所以请搜索如何解决锁定阻塞并从那里开始

标签: sql-server transactions locking isolation


【解决方案1】:

TRY CATCH 块中的代码执行大量数据更新。更改隔离级别不会解决锁定问题。

最适合您的是进行这些基本检查/更改:

  • 尝试将更新/插入分成更小的批次;事情会更顺利地进行,从而显着减少锁定。
  • 检查参与更新查询的表的索引,以便更快地返回数据。

【讨论】:

    【解决方案2】:

    这里的问题与隔离级别无关,是 Exclusive 的问题。

    这是锁定Escalation直到数据库级别的情况。

    避免升级做小批量事务...

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多