SQL Server Large Transaction锁定所有表

时间:2016-08-03 06:26:56

标签: sql-server transactions locking isolation

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

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

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隔离级别设置,但这似乎没有什么区别。

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

亲切的问候,

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

直到数据库级别才锁Escalation

避免升级执行较小的批次交易......